Laravel whereBetween 带可选参数

Posted

技术标签:

【中文标题】Laravel whereBetween 带可选参数【英文标题】:Laravel whereBetween with optional parameter 【发布时间】:2022-01-06 04:55:22 【问题描述】:

我需要使用whereBetween 子句构建查询,但有一个转折,我没有找到适用于我的案例的答案。我需要,因为当from 参数不存在时,将其视为从头开始查询。如果to 参数不存在,则需要查看前面提到的参数之后的所有内容。

当前查询:

Vehicle::whereBetween("updated_at", [$dates->start_date, $dates->end_date])->with("something")->get();

我希望它是怎样的:

Vehicle::whereBetween("updated_at", "lookup from start date if present, if not, look from beginning", "lookup to said end date if it's present, if not, look up till the end"])->with("something")->get();

我在问,当参数不存在时,什么是合适的,所以它按照我描述的方式工作?

编辑: 如果省略,开始日期,查询工作正常。如果省略结束日期,则查询在最佳情况下返回零。最坏的情况,抛出一个错误。 我尝试将null,空字符串,false,零(0)作为结束日期,没有任何效果。

【问题讨论】:

whereBetween 必须有两个参数开始日期和结束日期,如果您有可选参数,请尝试使用不同的if 条件和where 子句。 当您说fromto 时,您指的是$dates->start_date$dates->end_date 值吗?如果是这样,请您显示您在哪里获取/设置$dates @Rwd 我是从 Postman 寄来的。 【参考方案1】:

不使用whereBetween 并有条件地简单地添加where 子句会更有意义。您可以使用when() 方法来做到这一点:

Vehicle::with("something")
    ->when($dates->start_date, function ($query, $date) 
        $query->where('updated_at', '>=', $date);
    )
    ->when($dates->end_date, function ($query, $date) 
        $query->where('updated_at', '<=', $date);
    )
    ->get();

【讨论】:

它是这样工作的。不要听起来忘恩负义,我看起来更优雅,但是伙计......他们需要在每个子句中包含“可选参数”的东西。

以上是关于Laravel whereBetween 带可选参数的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:模型属性和 whereBetween

HDU 5716 带可选字符的多字符串匹配(ShiftAnd)

在 Laravel 中不与 whereBetween 合作的地方

为啥在 laravel 的 whereBetween 中不起作用

『HDU 5716』带可选字符的多字符串匹配 (bitset压位)

whereBetween 不使用 Carbon::parse()->subDay() & 当前日期 laravel