2015-12-23 2 views
0

Я создаю панель администратора, и у меня есть 3 таблицы в моей базе данных: группы, роли, пользователи. У меня есть много разных отношений между таблицей пользователей и таблицей ролей. В этой документации нет документации laravel.Constraint Eager Загрузка с областями запросов

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

И у меня есть отношение друг к другу между таблицей групп и таблицей пользователей.

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

В настоящее время я хочу применить фильтры к запросу посредством активной загрузки. И с ними я хочу добавить следующие динамические фильтры.

public function scopeStatus($query, $status = null) { 
    // If status is empty then return the query itself 
    if (is_null($status)) { 
     return $query; 
    } 

    return $query->where('status', $status); 
} 

public function scopeRole($query, $role = null) { 
// If role is empty then return the query itself 
if (is_null($role)) { 
    return $query; 
} 

return $query->where('role', $role); 
} 

public function scopeGroup($query, $group = null) { 
    // If group is empty then return the query itself 
    if (is_null($group)) { 
     return $query; 
    } 

    return $query->where('group_id', $group); 
} 

Так что я могу сделать некоторые запрос типа [статуса и group_id лишь столбцы в таблице пользователей]

$users = User::with([ 
    'roles' => function ($query) use ($request) { 
     $query->role($request['role']); 
    }, 

    'group' => function($query) use ($request) { 
     $query->group($request['group']); 
    } 
]) 
    ->status($request['status']) 
    ->paginate(20); 

Но это не работает. Я делаю это через запрос AJAX, и я проверил параметры запроса. Это то, что я получаю, когда я делаю dd($request);.

array:3 [▼ 
    "group" => "1" 
    "role" => "1" 
    "status" => "1" 
] 

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

+0

Не могли бы вы показать образец 'дд ($ запроса)' только перед запуском '$ пользователей = User :: ...'? –

+0

Хорошо, я добавлю его как отредактировав на вопрос –

+0

Начните с '$ users = User :: status ($ request ['status']) -> paginate (20);' - вы получаете ожидаемые результаты? –

ответ

0

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

Так что с моей проблемой все области применения, но статус не нужны. Это новый код:

 $users = User::with([ 
 
      'roles' => function ($query) use ($request) { 
 
       if (is_null($request['role'])) { 
 
        $query; 
 
       } else { 
 
        $query->where('id', $request['role']); 
 
       } 
 
      }, 
 

 
      'group' => function ($query) use ($request) { 
 
       if (is_null($request['group'])) { 
 
        $query; 
 
       } else { 
 
        $query->where('id', $request['group']); 
 
       } 
 
      } 
 
     ])->status($request['status']) 
 
      ->paginate(20);

Смежные вопросы