Фильтр множественных условных предложений в Laravel

#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. В этом ответе отсутствует его образовательное объяснение.