Используя где, чтобы сделать запрос фильтра в laravel, возвращает пустые данные?

#php #laravel

Вопрос:

У меня есть таблица ролей и администраторов и сводная таблица для admin_role

структура таблицы ролей

id, role_name, slug

структура таблицы администраторов

id, name, email, phone

структура таблицы admin_role

id, role_id, admin_id

Admin.php Модель

 public function roles() {
    return $this->belongsToMany(Role::class,'admin_role');
}
 

Role.php Модель

 public function admins() {
    return $this->belongsToMany(Admin::class,'admin_role');  
}
 

AdminController.php

 public function getTeams() {
    try {
        $selectedName = request('name');
        $selectedRole = request('role');
        $selectedPhone = request('phone');
        $admins = Admin::with(['roles','resources'])
            ->when($selectedName, function($query) use($selectedName) {
                $query->where('name', 'like', '%' .$selectedName.'%');
            })
            ->when($selectedPhone, function($query) use($selectedPhone) {
                $query->where('phone_number', $selectedPhone);
            })
            ->when($selectedRole, function($query) use($selectedRole) {
                $query->whereHas('roles', function ($q) use($selectedRole){
                    $q->whereIn('role_id', $selectedRole);
                });
            })
            ->orderBy('id', 'desc')
            ->paginate(10);
        return response()->json($admins);
    } catch (IlluminateDatabaseQueryException $e) {
        $e = "Get teams Api Error";
        return response()->json($e);
    }
}
 

Приведенный выше запрос работал нормально, он фильтровал данные на основе выбранного имени, телефона, но после добавления предложения whereHas для фильтрации на основе ролей он возвращает пустой массив. Фильтрация работает только тогда, когда я передал данные в выбранной роли.

Любые предложения о том, где я допустил ошибку.

Я добавил свой пользовательский интерфейс таблицы администратора.

таблица администратора

без применения какого-либо фильтра (имя, адрес электронной почты, телефон, роль) он должен отображать данные на основе запроса по умолчанию, который я добавил. Как только опция фильтра выбрана, она должна отображать данные, основанные на этом параметре фильтра.

Моя проблема : если я передал роль, то данные отображаются в таблице, но если не выбран какой-либо фильтр, то вместо данных по умолчанию есть пустая таблица.

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

 ->when($selectedRole, function($query) use($selectedRole) {
    $query->whereHas('roles', function ($q) use($selectedRole){
        $q->whereIn('role_id', $selectedRole);
    });
})
 

Комментарии:

1. Что вы получаете в $selectedRole ? Это одно значение или массив?

2. это массив типа [«1″,»2»]

3. Попробуйте изменить: $q->Где(‘role_id’, $selectedRole); на $q->>Где(‘id’, $selectedRole);

Ответ №1:

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

 $q->whereIn('admin_role.role_id', $selectedRole);
 

или

 $q->whereIn('admin_role.id', $selectedRole);
 

Обновленный

 ->when((isset($selectedRole)amp;amp;count($selectedRole)), function($query) use($selectedRole) {
    $query->whereHas('roles', function ($q) use($selectedRole){
      $q->whereIn('admin_role.id', $selectedRole);
    });
})
 

Комментарии:

1. те же проблемы, он возвращает пустой массив

2. @анжи. у меня есть обновление answer.it должно быть admin_role

3. ->when($selectedRole, function($query) use($selectedRole) { $query->whereHas('roles', function ($q) use($selectedRole){ $q->whereIn('roles.id', $selectedRole); }); }) этот запрос должен выполняться только в том случае, если есть какое-либо значение selectedRole, в противном случае запрос будет выполняться в обычном режиме без применения фильтра. Именно из-за этого запроса возвращается пустой массив без применения какого-либо фильтра.

4. @анжи.это не роли.идентификатор.проверьте мой обновленный ответ

5. Снова не работает, я думаю, проблема в том, где