Laravel 5.3 выполняет множество операций через промежуточную таблицу

#php #laravel #laravel-5.3

#php #laravel #laravel-5.3

Вопрос:

У меня есть следующая связь между таблицами:

 organizations
  id - integer

organization_users
  organization_id - integer (FK)
  user_id - integer (FK)

users
  id - integer
  

Я пытаюсь привлечь всех пользователей организации через красноречивые отношения. Вот мой Organization.php модель с ее взаимосвязями:

 class Organization extends Model
{
  public function Users(){
      return $this->hasManyThrough('AppUser', 'AppOrganizationUser',
                                   'organization_id', 'user_id', 'id');
...
}
  

Я перепробовал множество комбинаций этих отношений, таких как

 return $this->hasManyThrough('AppUser', 'AppOrganizationUser',
                                   'user_id', 'organization_id', 'id');
  

Но все они выдают примерно одну и ту же ошибку (эта из первого запроса):

 IlluminateDatabaseQueryException with message 'SQLSTATE[42S22]: Column not
 found: 1054 Unknown column 'organization_users.id' in 'on clause' (SQL: select
 `users`.*, `organization_users`.`organization_id` from `users` inner join 
`organization_users` on `organization_users`.`id` = `users`.`user_id` where 
`organization_users`.`organization_id` = 1)'
  

Возможно ли, что я могу заставить связь извлекать user_id для запроса в таблице users вместо того, чтобы Laravel пытался извлечь organization_users.id ? Если нет, есть ли другой способ обойти это?

Комментарии:

1. Ваш сценарий — отношения «многие ко многим». hasManyThrough используется для доступа к дистанционным отношениям, таким как в сценарии «организация имеет много пользователей, а пользователи имеют много сообщений, и поэтому вы можете создавать сообщения организации hasManyThrough , чтобы получать доступ к сообщениям организаций косвенно от пользователей»..

Ответ №1:

Это отношение многие ко многим.

Пользовательская модель:

 public function organizations()
{
    return $this->belongsToMany('AppOrganization','organization_users');
}
  

Модель организации:

   public function users()
   {
        return $this->belongsToMany('AppUser','organization_users');
   }
  

Чтобы получить всех пользователей с их организациями:

 $users=User::with('organizations')->get();
foreach($users as $user)
{
   print_r($user->name);
   foreach($user->organizations as $organization)
   {
     print_r($organization->name);
   }
}
  

Комментарии:

1. Да, я пытался описать отношения «многие ко многим». Спасибо, что указали на это. Работает как по волшебству.

Ответ №2:

То, что вы описываете, выглядит так, как будто это может быть отношение «Многие ко многим».

https://laravel.com/docs/5.3/eloquent-relationships#many-to-many