在 laravel 查询构建器中结合 when() 和 whereBetween() 方法

Posted

技术标签:

【中文标题】在 laravel 查询构建器中结合 when() 和 whereBetween() 方法【英文标题】:combining when() and whereBetween() methods in laravel query builder 【发布时间】:2020-01-05 17:20:19 【问题描述】:

我在 Larevel 中有一个模型,它接收用于报告数据库中总单位的参数。

我希望能够根据用户选择的$entity_ids$start$end 日期过滤返回的单位。

entity_ids 可以通过简单的whereIn() 方法调用正常工作,但日期会导致一些问题。

我在Order.php 模型中的代码如下:

public static function getAllOrdersForReporting($entity_ids, $start, $end) 
    $orders = Order::select('all order information entered here')
    ->whereIn('orders.entity_id', $entity_ids)
    ->when($start && $end, function ($query, $start, $end)  //<-- Error Thrown Here
        return $query->whereBetween('order_date', [$start, $end]);
    )
    ->join('entities', 'entities.id', '=', 'ura_orders.entity_id')
    ->join('entity_address_information', 'entity_address_information.entity_id', '=', 'ura_orders.entity_id')->distinct()->get();

    return $orders;

在我的ReportingController.php 中,我输入以下内容:

public function displayUnits() 
    $entities = request()->entities_ids;
    $start = request()->start_date;
    $end = request()->end_date;
    $orders = Ura_order::getAllOrdersForReporting($entities, $start, $end);

    return view('reporting.pages.units', compact('entities', 'start', 'end', 'orders'));

但是,当我运行它时,我收到以下错误:

函数参数太少 App\Models\Order::App\Modelsclosure(), 2 传入 C:\xampp\htdocs\mywebsite\vendor\laravel\framework\src\Illuminate\Database\Concerns\BuildsQueries.php 在第 91 行,预计正好 3 行

不完全确定这个错误是什么意思,除了 Model 只看到 2 个传入的错误,它预期 3 个。

我在上面的代码中标出了错误所在的行。

关于如何让它发挥作用的任何建议?我知道when() 的第三个参数应该是一个回调函数,但不知道如何使它工作。

【问题讨论】:

根据the docs,when 调用的第三个参数应该是一个函数。 $end 不是函数。 是的,我知道,我应该在问题中更清楚,我正在寻找如何使我正在寻找的功能工作,以及我不确定的第三个参数回调函数如果它会返回那个。 看看this话题 【参考方案1】:

你必须在你的回调函数中use变量:

->when($start && $end, function ($query) use ($start, $end) 
    return $query->whereBetween('order_date', [$start, $end]);
)

【讨论】:

【参考方案2】:

你可以试试这段代码:

->when($start && $end, function ($query, $condition) use($start, $end)  
        return $query->whereBetween('order_date', [$start, $end]);
    )

正如 cmets 中已经指出的,when() 的 tihrd 参数应该是 function,使用 use() 语句,您可以在闭包中传递变量。

【讨论】:

这行得通,但您不需要将 $condition 变量传递给函数。 你说得对,它不需要,但对其他有类似问题的人有用。

以上是关于在 laravel 查询构建器中结合 when() 和 whereBetween() 方法的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 查询构建器中使用多个 where 子句

在 Laravel get() 查询构建器中附加两个数组

在执行查询之前,如何从 Laravel 的查询构建器中获取原始查询字符串?

将带有变量的闭包传递给 Laravel 查询构建器中的 where 方法

如何从两个不同的 Laravel 查询构建器中获取我的两个结果集以同时显示在同一页面上?

Laravel 查询构建器条件与当前查询使用时