Как вырвать уникальные отношения из построителя запросов? - PullRequest
0 голосов
/ 10 апреля 2019

Мне нужно собрать уникальный набор отношений, которые присутствуют в наборе запросов моделей. У меня есть модель User с таблицей 'users' и модель Role с таблицей 'role', User hasMany Role.

//User.php
public function roles()
{
    return $this->belongsToMany(Role::class);
}

//Role.php
public function users()
{
    return $this->belongsToMany(User::class);
}

Я справился с этим с помощью коллекций, но он должен выполнить такой большой запрос, что замедляет весь запрос

//Controller
...
$users = User::query()->someChainOfScopes();
$uniqueRoles = $users->get()->pluck('roles')->flatten(1)->unique('id')->values();
...

Этот код возвращает коллекцию, в которой я нуждаюсь, но я хотел бы реализовать ее с помощью построителя запросов, чтобы использовать уникальные роли для повышения скорости

1 Ответ

0 голосов
/ 10 апреля 2019

Есть несколько разных способов сделать это с помощью Laravel,

Объединения могут быть опцией для объединения двух таблиц в запросе DB::table(), а затем для поиска пользователей по требуемым параметрам и возвратаthe role_id.

Чтобы ускорить пользователей

$user_ids = DB::table('users')->select('id')->someChainOfScopes()->get();

Цепные области, которые вы должны будете изменить на стандартные, где функции и т. д.

Затем используйте этот массив для запроса role_usertable direct

$role_ids = DB::table('role_user')
                ->select('role_id')
                ->whereIn('user_id', $user_ids)
                ->distinct()
                ->get();

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

Я не проверял, но, надеюсь, она поможет вам двигаться в правильном направлении.

...