Оптимизировать запрос в Laravel на большом бд - PullRequest
0 голосов
/ 22 мая 2018

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

Я ставлю васв контексте у нас есть три таблицы:

  • Users
  • Sedes
  • UsersSedes (pivot) [user_id, sedes_id]

В настоящее времяМне нужно показать в списке (Datatable) всех пользователей, которые содержат в своих sedes одно из мест, настроенных в активном пользователе (администратор).

Пример: Admin, зарегистрированные и активные sedes - это A и B (Есть также C и D) Список: Пользователь 1 с sede A Пользователь 2 с sede B Пользователь 3 с sede B Пользователь 4 с sede B

Я не знаю, объясню ли я ...

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

EDIT На самом деле я использую foreach, например, для создания массива с данными.:

$ pacientes = Usuario :: with (['sedes']) -> where ('role_id', 3) -> get ();

    $sedesHabilitadas = auth()->user()->sedes->pluck('id')->toArray();

    $habilitados = array();


     foreach($pacientes as $paciente)
    {
      if( in_array($paciente->sedes->pluck('id')->first(), $sedesHabilitadas))
        {
            array_push($habilitados, $paciente);
        }      

    }    

1 Ответ

0 голосов
/ 22 мая 2018

Похоже, что вы хотите sedes, где role_id = 3 и user_id = active user?Если это так, тогда вы можете просто добавить ограничение where к основному запросу:

$habilitados = Usuario::where('role_id', 3)
    ->where('user_id', auth()->user()->id)
    ->with(['sedes'])->get();

Это должно дать вам их 'sedes'.В противном случае, если вы имеете в виду, что он должен возвращать Users :: с их «sedes», которые имеют те же «sedes», что и администратор, то вы можете рассмотреть это:

$sedesHabilitadas = auth()->user()->sedes->pluck('id')->toArray();
$pacientes = Usuario::with(['sedes' => function($query) use (sedesHabilitadas){
        $query->whereIn('id', $sedesHabilitadas);
    ])->where('role_id', 3)->get();

Но это выглядит какповторный метод, так как запрашиваемый идентификатор уже получен как $sedesHabilitadas.

Если это не так, дайте мне знать, поэтому мне, возможно, придется удалить этот ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...