Laravel Красноречивая связь между моделями - PullRequest
0 голосов
/ 07 июня 2018

Мне нужна помощь с запросом результата связи между моделями.Определены две модели: Пользователь и Роль модель.

Пользователь:

public function roles()
{
    return $this->belongsToMany('App\Role', 'role_users');
}

public function hasAccess(array $permissions) : bool
{
    foreach ($this->roles as $role) {
        if ($role->hasAccess($permissions)) {
            return true;
        }
    }

    return false;
}

public function inRole(string $slug)
{
    return $this->roles()->where('slug', $slug)->count() == 1;
}

Роль:

public function users()
{
    return $this->hasMany('App\User', 'role_users');
}

public function hasAccess(array $permissions) : bool
{
    foreach ($permissions as $permission) {
        if ($this->hasPermission($permission)) {
            return true;
        }
    }

    return false;
}

private function hasPermission(string $permission) : bool
{
    return $this->permissions[$permission] ?? false;
}

Также определена сводная таблица с именем role_users.В базе данных roles несколько ролей предопределены заранее (администратор, редактор, автор).

Я хочу запросить пользователей по их ролям, например,

$editors = App\User::roles(2)->orderBy('name', 'asc')->get()

где в базе данных roles редактор id равен 2. Я получил ошибку

PHP Deprecated:  Non-static method App/User::roles()

Как решить эту проблему?Примечание: я использую Laravel 5.6 и новичок в Laravel и фреймворке.Я пытался сослаться на документы , но это меня смутило.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

@ devk правильно, но здесь у вас есть другой способ получить данные пользователя по роли.

\App\Role::where('id', 2)->with('users')->get();
0 голосов
/ 07 июня 2018

Вы должны использовать whereHas(..):

$editors = \App\User::whereHas('roles', function ($q) {
    $q->where('id', 2);
})->orderBy('name', 'asc')->get()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...