#php #mysql #eloquent #laravel-8
#php #mysql #красноречивый #laravel-8
Вопрос:
Я пытаюсь отфильтровать таблицу, но некоторые значения запроса могут быть нулевыми. Есть ли способ сделать его более простым, или мне нужно создать несколько операторов IF?
$archives = Archive::when($vehicle, function ($query) use ($vehicle) {
return $query->where('vehicle_id', $vehicle);
})->when($month, function ($query) use ($month) {
return $query->whereMonth('startduration', $month)
->orWhereMonth('endduration', $month);
})->when($year, function ($query) use ($year) {
return $query->whereYear('startduration', $year)
->orWhereYear('endduration', $year);
})->when($status, function ($query) use ($status) {
return $query->where('archivedtype', $status);
})->orderBy('endduration', 'desc')->paginate(20);
Комментарии:
1. Было бы лучше передать действительные данные в функции запроса. Используйте несколько If, проверяющих, является ли оно null или нет. Старая поговорка: «Входящий мусор — это выходящий мусор». Исходя из этого, вы можете правильно ошибиться, если это необходимо, или изменить запрос, чтобы он выполнял только то, что должен.
Ответ №1:
Решил это. Спасибо
$archives = Archive::where( function($query) use($request){
return $request->vehicle ? $query->where('vehicle_id',$request->vehicle) : '';
})
->where(function($query) use($request){
return $request->month ? $query->whereMonth('startduration',$request->month)->orWhereMonth('endduration',$request->month) : '';
})
->where(function($query) use($request){
return $request->year ? $query->whereYear('startduration',$request->year)->orWhereYear('endduration',$request->year) : '';
})
->where( function($query) use($request){
return $request->status ? $query->where('archivedtype',$request->status) : '';
})
->get();
Комментарии:
1. В этом ответе отсутствует его образовательное объяснение.
Ответ №2:
$archives = Archive::query()
->when($request->month, function ($query, $m) {
$query->where(fn ($q) => $q->whereMonth('startduration', $m)->orWhereMonth('endduration', $m));
})
->when($request->year, function ($query, $y) {
$query->where(fn ($q) => $q->whereYear('startduration', $y)->orWhereYear('endduration', $y))
})
->when($request->vehicle, fn ($q, $v) => $q->where('vehicle_id', $v))
->when($request->status, fn ($q, $s) => $q->where('archivedtype', $s))
->orderBy('endduration', 'desc')
->paginate(20);
Комментарии:
1. В этом ответе отсутствует его образовательное объяснение.