Laravel: добавить ограничение на отношения многие ко многим

Рассмотрим это простое отношение «многие ко многим» в 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 в сессии. Какие изменения я должен сделать в модели сделать это?


Примечание: я не хочу ничего менять в коде использования! В любом случае, нельзя ли добавить логику фильтра в объявление модели? Потому что я нахожусь в середине большого проекта, и трудно изменить каждое использование. Является ли это возможным?

0

Решение

//User model
public function roles()
{
$repoID = MyApp::currentRepoID();

return $this->belongsToMany('Role', 'pivot_table_name', 'user_id', 'role_id')
->wherePivot('repository_id', $repoID);
}
3

Другие решения

Если вам нужно добавить дополнительные поля в сводную таблицу, вы должны использовать метод -> 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;
}
1

Проверять, выписываться Eloquent Triple Pivot (также на Packagist), похоже, что он делает именно то, что вы хотите.

Вы бы настроили свои модели как User, Repository а также RoleUser имеет много 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;
1
По вопросам рекламы [email protected]