Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 26.03.2015 05:39:23

Проблема с получением pivot в Eloquent ORM

Здравия желаю.

Есть таблицы account, account_role, role
один Account может принадлежать нескольким Role сразу.
Есть связующая таблица account_role — которая связывает их по account_id и role_id
Link: er-диаграмма

В модели Account для этого сделана связь:

PHP
public function roles()
{
    return 
$this->belongsToMany('App\Role''account_role''account_id''role_id''App\AccountRole');
}

И она нормально работает, выводит соотвествующие роли как надо.
Но проблема возникла, когда появилась задача вывести для конкретной роли аккаунта некоторые данные из связующей таблицы account_role
И первое, что пришло на ум, это сделать так:

PHP
$account App\Account::find(1);
$role $account->roles()->find($roleId);
dump($role->pivot); // Вернет NULL, хотя в $role содержится нужный App\Role

Если же проверить наличие pivot в коллекции, то он там есть:

PHP
$account App\Account::find(1);
$role $account->roles()->get()->last();
dump($role->pivot); // Вернет соотвествующий App\AccountRole

Такой эксперемент вернул все данные:

PHP
$account App\Account::find(1);
$role $account->roles()->first();
dump($role->pivot); // Вернет соотвествующий App\AccountRole

Но мне нужно pivot только конкретной роли, попытка не удалась:

PHP
$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)

Не в сети

#2 26.03.2015 05:57:07

Re: Проблема с получением pivot в Eloquent ORM

Можно конечно указать имя колонки с таблицей:

PHP
$account App\Account::find(108);
$role $account->roles()->where('role.id','='106)->first();
dump($role->pivot); // Вернет соотвествующий App\AccountRole

Но это как-то совсем стремно. Для чего тогда ORM?

Не в сети

#3 28.03.2015 19:20:21

Re: Проблема с получением pivot в Eloquent ORM

id не видит, потому что ORM ограничивает зону видимости

А если так:

PHP
$account App\Account::with(['roles' => function($query){
    
$query->whereId($roleId);
}])->
whereId($accountId);

Либо, если одной роли может принадлежать только один аккаунт:

PHP
$account App\Account::whereHas('roles', function($query){
    
$query->whereId($roleId);
})->
with('roles')->first();

Изменено Goshik (28.03.2015 19:28:55)

Не в сети

Подвал раздела