Laravel 5.3 hasManyThrough через промежуточную таблицу

У меня есть следующие отношения таблицы:

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('App\User', 'App\OrganizationUser',
                                   'organization_id', 'user_id', 'id');
...
}

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

return $this->hasManyThrough('App\User', 'App\OrganizationUser',
                                   'user_id', 'organization_id', 'id');

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

Illuminate\Database\QueryException 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 для запроса к таблице пользователей вместо того, чтобы Laravel пытался получить организация_users.id? Если нет, есть ли другой способ обойти это?


person James A    schedule 25.10.2016    source источник
comment
Ваш сценарий представляет собой отношения «многие ко многим». hasManyThrough используется для доступа к дистанционным отношениям, например, в сценарии организации много пользователей, а у пользователей много сообщений, поэтому вы можете использовать сообщения организации hasManyThrough для доступа к сообщениям организаций косвенно от пользователей.   -  person Lionel Chan    schedule 25.10.2016


Ответы (2)


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

Модель пользователя:

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

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

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

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

$users=User::with('organizations')->get();
foreach($users as $user)
{
   print_r($user->name);
   foreach($user->organizations as $organization)
   {
     print_r($organization->name);
   }
}
person Sanzeeb Aryal    schedule 25.10.2016
comment
Да, я пытался описать отношения многие ко многим. Спасибо, что указали на это. Работает как шарм. - person James A; 25.10.2016

То, что вы описываете, похоже, может быть отношением «многие ко многим».

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

person LegenJerry    schedule 25.10.2016