Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Есть таблицы account, account_role, role
один Account может принадлежать нескольким Role сразу.
Есть связующая таблица account_role — которая связывает их по account_id и role_id
Link: er-диаграмма
В модели Account для этого сделана связь:
public function roles()
{
return $this->belongsToMany('App\Role', 'account_role', 'account_id', 'role_id', 'App\AccountRole');
}
И она нормально работает, выводит соотвествующие роли как надо.
Но проблема возникла, когда появилась задача вывести для конкретной роли аккаунта некоторые данные из связующей таблицы account_role
И первое, что пришло на ум, это сделать так:
$account = App\Account::find(1);
$role = $account->roles()->find($roleId);
dump($role->pivot); // Вернет NULL, хотя в $role содержится нужный App\Role
Если же проверить наличие pivot в коллекции, то он там есть:
$account = App\Account::find(1);
$role = $account->roles()->get()->last();
dump($role->pivot); // Вернет соотвествующий App\AccountRole
Такой эксперемент вернул все данные:
$account = App\Account::find(1);
$role = $account->roles()->first();
dump($role->pivot); // Вернет соотвествующий App\AccountRole
Но мне нужно pivot только конкретной роли, попытка не удалась:
$account = App\Account::find(1);
$role = $account->roles()->whereId($roleId)->first(); // Exception - SQLSTATE[42702]: Ambiguous column: 7 ERROR: column reference "id" is ambiguous
dump($role->pivot);
Видно, что он не понимает, к какой таблице этот ID относится:
Link: Скрин ошибки
Но как её указать по нормальному?
Изменено DrLines (26.03.2015 05:42:43)
Не в сети
Не в сети
id не видит, потому что ORM ограничивает зону видимости
$account = App\Account::with(['roles' => function($query){
$query->whereId($roleId);
}])->whereId($accountId);
Либо, если одной роли может принадлежать только один аккаунт:
$account = App\Account::whereHas('roles', function($query){
$query->whereId($roleId);
})->with('roles')->first();
Изменено Goshik (28.03.2015 19:28:55)
Не в сети
Страницы 1