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

时间:2019-09-02 17:32:15

标签: php laravel

我在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 \ Models {closure}(),传入了2   C:\ xampp \ htdocs \ mywebsite \ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Concerns \ BuildsQueries.php   在第91行,正好是3个

完全不确定该错误的含义,除了Model仅看到2个传入的错误并且预期为3个。

我在上面的代码中标记了引发错误的行。

有关如何使其正常工作的任何建议?我知道when()的第3个参数应该是一个回调函数,但不确定如何使它起作用。

2 个答案:

答案 0 :(得分:2)

您必须在回调函数中使用use个变量:

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

答案 1 :(得分:1)

您可以尝试使用以下代码:

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

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