Рассмотрим это простое отношение «многие ко многим» в Laravel:
class User extends Eloquent {
public function roles()
{
return $this->belongsToMany('Role');
}
}
а также
class Role extends Eloquent {
public function users()
{
return $this->belongsToMany('User');
}
}
Это нормально со схемой role_user
это держит user_id
а также role_id
,
Но что, если у нас есть другие ограничения? Например, в таком приложении, как Github, пользователь является администратором в хранилище A и обычным пользователем в хранилище B. Поэтому мы добавляем repository_id
в role_user
таблица, но когда я хочу запросить user->roles
Я хочу посмотреть на это в текущем хранилище, что я сохраняю ссылку на current_repository_id
в сессии. Какие изменения я должен сделать в модели сделать это?
Примечание: я не хочу ничего менять в коде использования! В любом случае, нельзя ли добавить логику фильтра в объявление модели? Потому что я нахожусь в середине большого проекта, и трудно изменить каждое использование. Является ли это возможным?
//User model
public function roles()
{
$repoID = MyApp::currentRepoID();
return $this->belongsToMany('Role', 'pivot_table_name', 'user_id', 'role_id')
->wherePivot('repository_id', $repoID);
}
Если вам нужно добавить дополнительные поля в сводную таблицу, вы должны использовать метод -> withPivot ().
Если ваша структура сводной таблицы имеет вид:
id | role_id | user_id | repository_id
ты должен использовать
return $this->belongsToMany('Role', 'pivot_table_name', 'user_id', 'role_id')->withPivot('repository_id');
Затем, где бы вы ни использовали его, вы должны сделать:
$role = Role::find(1);
$role->pivot->repository_id;
или же
$user = User::find(1);
foreach ($user->roles as $role) {
echo $role->pivot->repository_id;
}
Проверять, выписываться Eloquent Triple Pivot (также на Packagist), похоже, что он делает именно то, что вы хотите.
Вы бы настроили свои модели как User
, Repository
а также Role
(а User
имеет много Repository
и может иметь Role
в каждом). Затем посмотрите документы на странице Github (особенно шаг 6), и вы определите это на своем Repository
модель:
class Repository extends Eloquent {
...
public function getRolesAttribute() {
return $this->getThirdAttribute();
}
}
Тогда вы можете просто позвонить
$user = User::find(1);
$repo = $user->repositories->first();
// or
$repo = $user->repositories->find(73);
$roles = $repo->roles;
// Or the above can be condensed into just...
$roles = User::findOrFail( 1 )
->repositories()
->findOrFail( 73 )
->roles;