簡體   English   中英

在Laravel查詢構建器中結合when()和whereBetween()方法

[英]combining when() and whereBetween() methods in laravel query builder

我在Larevel中有一個模型,該模型接受用於報告數據庫中總單位的參數。

我希望能夠根據用戶選擇的$entity_ids$start$end日期過濾返回的單位。

通過一個簡單的whereIn()方法調用, entity_ids可以正常工作,但是日期引起了一些問題。

我在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}()的參數太少,在C:\\ xampp \\ htdocs \\ mywebsite \\ vendor \\ laravel \\ framework \\ src \\ Illuminate \\ Database \\ Concerns \\ BuildsQueries.php中傳遞了2個參數在第91行,正好是3個

不確定該錯誤的含義,除了Model僅看到2個傳入的錯誤且預期為3個錯誤。

我在上面的代碼中標記了將錯誤引發的行。

關於如何使它起作用的任何建議? 我知道when()的第三個參數應該是一個回調函數,但不確定如何使它工作。

您必須在回調函數中use變量:

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

您可以嘗試使用以下代碼:

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

正如注釋中已經指出的, when()的tihrd參數應該是一個functionuse()語句可以在閉包中傳遞變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM