#php #mysql #laravel #eloquent
#php #mysql #laravel #красноречивый
Вопрос:
В настоящее время я работаю над фильтрами поиска ajax в Laravel, но я не могу получить правильную информацию, это сценарий:
У меня есть 2 таблицы:
-
Таблица 1: SoftwareRequest
-
Таблица 2: DenyCategory
с помощью опции выбора я получаю имя в качестве значения
и я добавил эту опцию выбора, как в верхней части запроса к функции контроллера:
$deniedReason = $request->get('deniedReason');
if($deniedReason == "All"){
$deniedReason = "";
}
Таким образом, это означает, что каждый раз, когда я выбираю «Все», он будет пустым, поэтому я могу получить все данные как пустые (в этом проблема).
Это мой текущий запрос:
$request_data = SoftwareRequest::leftJoin('DenyCategory', 'SoftwareRequest.DenyCategoryId', '=', 'DenyCategory.Id')->where('DenyCategory.Name', 'like', '%' . $deniedReason . '%')->paginate(20);
Итак, дело в том, что если я выбираю другой параметр вместо «Все», например «Уже доступно», я получаю исключенные данные, то есть все объекты из таблицы 1, объединенные с таблицей 2, в которой есть этот параметр, но проблема возникает, когда я выбираю «Все», это не приводит ко всем данным, которые должны, и это потому, что не все объекты имеют DenyCategoryId
в Table1, что означает, что некоторые из них являются Null / empty, поэтому он приводит только те, которые ‘LIKE’ Null / empty, как я указал в предыдущий блок кода.
$deniedReason = $request->get('deniedReason');
if($deniedReason == "All"){
$deniedReason = "";
}
Как я могу получить все данные пустыми или не пустыми при выборе опции All и, а также получить данные при выборе другого параметра? Бьюсь об заклад, это как-то связано с тем, что запрос не является «Подобным», но это выходит за рамки моих знаний.
Комментарии:
1. Использовать
$request->input('deniedReason')
2. привет @Sobir Я получаю значение входных данных, проблема в том, что мне нужно получить ВСЕ данные, включая Null, из объединенного столбца SoftwareRequest. DenyCategoryId с таблицей DenyCategory
3. есть ли способ изменить родительское значение на NotNull, например. ->leftJoin(‘DenyCategory’, ‘NOTNULL(SoftwareRequest. DenyCategoryId)’, ‘=’, ‘DenyCategory. Id’) Поэтому я мог получить только те, в которых есть данные
Ответ №1:
Почему бы не сделать where
предложение необязательным?
$queryBuilder = SoftwareRequest::leftJoin('DenyCategory', 'SoftwareRequest.DenyCategoryId', '=', 'DenyCategory.Id')
// Only apply where-clause when denied reason has been provided.
if ($request->get('deniedReason') !== 'All') {
$queryBuilder = $queryBuilder->where('DenyCategory.Name', 'like', '%' . $deniedReason . '%');
}
$request_data = $queryBuilder->paginate(20);
Я думаю, вы можете немного улучшить свой код, но я оставлю это на ваше усмотрение с некоторыми указателями:
Комментарии:
1. спасибо, я попробую это. Хм, есть ли способ изменить значение table1 на NotNull в левом соединении, например. ->leftJoin(‘DenyCategory’, ‘NOTNULL(SoftwareRequest. DenyCategoryId)’, ‘=’, ‘DenyCategory. Id’) Поэтому я мог получить только те, в которых есть данные
2. Я попробовал то, что вы сказали, и сработало, как ожидалось, спасибо, Дэнни