【问题标题】:Multiple conditional clause filter in LaravelLaravel 中的多个条件子句过滤器
【发布时间】:2020-12-16 01:50:00
【问题描述】:

我正在尝试过滤表,但某些请求值可能为空。有没有办法让它更简单,还是我需要创建多个 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);

【问题讨论】:

  • 最好将有效数据传递给查询函数。使用多个 If 检查它是否为空。古语说“垃圾进就是垃圾出”。由此,您可以在需要时正确出错,或者修改查询以仅执行应做的事情。

标签: php mysql eloquent laravel-8


【解决方案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(); 

【讨论】:

  • 这个答案缺少教育解释。
【解决方案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);

【讨论】:

  • 这个答案缺少教育解释。
猜你喜欢
  • 2019-03-17
  • 1970-01-01
  • 2023-03-27
  • 2015-11-06
  • 2023-01-20
  • 2019-03-22
  • 2012-12-06
  • 2021-12-28
  • 2021-10-30
相关资源
最近更新 更多