Существуют ли отношения для отношений в laravel? - PullRequest
0 голосов
/ 03 мая 2019

Пример

Роль -> hasMany -> Пользователь

Если я хочу получить всех пользователей с определенной ролью, я обычно делаю что-то вроде этого:

$role = Role::findOrFail(1);
User::where('role.id', $role->id)->get()

или

User::where('role_id', $role->id)->get()

Мой вопрос: Есть ли способ добиться этого без использования role_id или id. Я хочу просто использовать объект $role. Примерно так было бы здорово:

User::where('role', $role)->get();

Я знаю, что могу использовать $role->users, но я опускаю это, потому что я не могу использовать это, если у меня есть несколько отношений ownTo, которые я хочу запросить.

* * Пример тысяча двадцать-одина * * тысяча двадцать-дв
$model->where('otherModel', $otherModel1)->where('differentModel', $differentModel1)->get();

Фон

Такое решение очень поможет, если вы хотите переименовать первичный или внешний ключ или если ваше приложение имеет ключи с нелогичными именами.

1 Ответ

0 голосов
/ 03 мая 2019
User::where('role', $role)->get();

Вы не можете сделать это или достичь этого напрямую. Это потому, что вы сравниваете столбец (role) с объектом отверстия. Что вы можете сделать, это определить Локальные области действия .

Я знаю, что могу использовать $ role-> users, но я опускаю это, потому что я не могу использовать это, если у меня есть несколько отношений ownTo, которые я хочу запросить.

На самом деле, в этом случае вы используете не belongsTo() отношение, а hasMany() (противоположное). Опять же, вы можете создать Local Scopes , чтобы ограничить ваш запрос, чтобы получить пользователей, соответствующих вашим условиям.

Пример использования пользовательского поиска по столбцу / значению, как вы предложили в последней части вашего вопроса:

/** User.php */

public function hasRoleScope($query, $column, $value)
{
    return $query->where("role.{$column}", '=', $value);
}

Тогда вы могли бы сделать:

/** AnyController.php */

User::has_role('name', 'admin')->get();
// equivalent to: User::where('role.name', '=', 'admin)->get();

Вы можете продолжить определять еще один:

/** User.php */

public function scopeActive($query, $value)
{
    return $query->where('active', $value);
}

Тогда вы могли бы сделать:

/** AnyController.php */

User::active(true)->get();
// equivalent to: User::where('active', true)->get();

Интересная часть? Вы можете комбинировать области действия:

/** AnyController.php */

User
    ::active(false)
    ->has_role('id', 23)
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...