#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. Снова не работает, я думаю, проблема в том, где