#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