Выбор нескольких таблиц с помощью Laravel Eloquent - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть 3 таблицы - пользователи, роли и role_user. Каждому пользователю назначается роль в таблице role_user, а список ролей находится в таблице ролей. Я хочу выбрать всех пользователей с идентификатором роли 12. В настоящее время я делаю это с помощью построителя запросов, но мне нужно, чтобы он был в красноречивом формате. Я не очень хорошо разбираюсь в Laravel eloquent, пожалуйста, мне нужна помощь в преобразовании запросов в eloquent. Вот что я сейчас делаю:

 $users = DB::table('users')
            ->join('role_user', 'users.id', '=', 'role_user.user_id')
            ->join('roles', 'roles.id', '=', 'role_user.role_id')
            ->where('roles.id', '=', 12)
            ->get();

Ответы [ 4 ]

0 голосов
/ 26 апреля 2018

Чтобы выполнить тот же запрос к БД в красноречивом формате, вам необходимо сделать следующее:

  1. У вас должна быть создана пользовательская модель, которая должна быть создана с вашим проектом, если вы включили аутентификацию laravel, о которой вы можете прочитать больше на здесь . Если нет, вы должны создавать свои модели.
  2. Чтобы использовать Модели в вашем контроллере или классе, вы должны включить его в своем php-файле:

    use App\User;

  3. Запустите ссылку на модель пользователя следующим образом.

    $users = User::join('role_user','users.id', '=', 'role_user.user_id') ->join('roles', 'roles.id', '=', 'role_user.role_id') -> where('roles.id', '=', 12) ->get();

$ пользователи теперь будут коллекцией и будут пользоваться всеми замечательными методами, доступными в коллекции.

Я предлагаю потратить некоторое время на ознакомление с бесплатным видеоуроком по laracast, чтобы по-настоящему понять, как модели используются с Eloquent. Дополнительно было бы хорошо рассмотреть готовые функции аутентификации из коробки. Я склонен делать все свои вызовы ролям, используя Auth. Надеюсь это поможет.

0 голосов
/ 26 апреля 2018

В ролевых моделях вы должны добавить это

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

В контроллере

$allusrs = Role::with('users')->where('id','=','12');
dd($allusrs);
0 голосов
/ 26 апреля 2018

С Eloquent очень легко получить извлечение реляционных данных, следуя примеру с вашим сценарием в Laravel 5

у нас есть три модели

1) Пользователи (имеет одного role_user)

2) Роли (имеет много role_user)

3) RoleUser (принадлежит пользователю и роли)

1) Users.php

<?php

namespace App\Models;
 use Eloquent;

class Users extends Eloquent{

    protected $table = 'users';

    public function userrole()
    {
        return $this->hasOne('App\Models\RoleUser');
    }

}

2) Roles.php

<?php

namespace App\Models;

use Eloquent;

class Roles extends Eloquent
{
    protected $table = "roles";

    public function rolesuser()
    {
        return $this->hasMany('App\Models\RoleUser');
    }

}

2) RoleUser.php

<?php

namespace App\Models;
 use Eloquent;

class RoleUser extends Eloquent{

    protected $table = 'role_user';

    public function user()
    {
        return $this->belongsTo('App\Models\Users');
    }

    public function role()
    {
        return $this->belongsTo('App\Models\Roles');
    }

}

Вам необходимо проверить, что ваша база данных имеет связь и настройки в моделях. Пользователи имеют одну роль в таблице role_user. Роль имеет много ролей для пользователей в таблице role_user. Роль пользователя принадлежат пользователям и ролям. Как только вы настроите отношения в laravel / database, вы сможете легко получить соответствующую информацию.

Например, если вы хотите получить пользователей с помощью роли пользователя, вам нужно написать:

$users = \App\Models\Users::with(['userrole'])->first();

Если вы хотите получить имя роли пользователя, вы можете написать:

$users->userrole->role->rolename; 
/* here rolename the column name you have in role table for role name*/

Теперь перейдем к вашему запросу: вы хотите выбрать только тех пользователей, у которых есть идентификатор роли 12. Теперь стало просто писать в красноречивом формате.

$users = \App\Models\RoleUser::where('role_id', 12)->with(['user', 'role'])->get(); 
/* Here role_id is the column you have in role_user table as reference for role table */

вы можете узнать больше здесь: https://laravel.com/docs/5.6/eloquent-relationships

0 голосов
/ 26 апреля 2018

Это даст использование с идентификатором роли 12:

User::whereHas( 'roles', function ( $query ) {
            $query->where( 'id', 12 );
        } )->get();

Я предполагал, что вы правильно установили отношения.

Если вы хотите динамически передать $ role_id, используйте следующее:

User::whereHas( 'roles', function ( $query ) use ($role_id) {
            $query->where( 'id', $role_id );
        } )->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...