發布時間:2024-01-23閱讀(9)
今天說一個細分的需求,在模型中,或者使用laravel提供的 Eloquent ORM 功能,構造查詢語句時,返回位于兩個指定的日期之間的條目。應該怎么寫?

本文通過幾個例子,為大家梳理一下。
學習時間假設有一個模型 Reservation,我們查詢某個日期的預訂條目數,首先構造日期字符串,使用內置函數:
$now = date(Y-m-d);
返回當前日期。然后調用模型的 where 查詢語句:
$reservations = Reservation::where(reservation_from, $now)->get();
上一條生成的SQL語句如下:
SELECT * from table_name where reservation_from = $now
只會返回日期比較相等的條目。如何實現在 from 和 to 之間的日期呢,類似下面這樣:
SELECT * FROM table_name WHERE reservation_from BETWEEN $from AND $to
在laravel中你可以使用 whereBETWEEN 這個查詢子句。首先構造起始和結束日期:
$from = date(2020-01-01);$to = date(2020-08-09);
然后調用查詢子句:
Reservation::whereBetween(reservation_from, [$from, $to])->get();
這樣就返回SQL查詢的 BETWEEN ... AND .... 語句了。
當然了,上面的方法是在SQL中直接進行篩選,如果查詢結果限制的條目本身比較少,也能充分利用索引,所以不擔心查詢的速度,那么我們可以在查詢完成后,在返回的 Eloquent Collection 集合上,鏈式調用過濾 filter 方法進行篩選。
那么代碼實現起來像下面這樣:

注意程序寫起來很柔順,使用 Carbon 提供的 between 方法進行判斷。程序上下文很好理解。
如果考慮初始查詢條件圈定的記錄條目過多,會對MySQL造成流量的壓力,那么在SQL階段直接篩選出最精準的記錄,無疑是個好習慣。whereBetween 在模型里鏈式調用毫無壓力:

如果你覺得框架自帶的where子句不足以滿足你的查詢需求,那么直接用原生查詢條件好了,用 whereRaw 就可以了,像下面的例子,先構造查詢區間:
$fromDate = "2020-02-01";$toDate = "2016-06-30";
然后使用參數綁定:
$reservations = Reservation::whereRaw("(reservation_from >= ? AND reservation_from <= ?)", [$fromDate." 00:00:00", $toDate." 23:59:59"])->get();
假如上面的寫法你覺得不夠直觀,或者很難把握,那就跟著直覺走。判斷日期之間,無非就是大于某個日期,且小于某個日期這樣。那直接用大小比較就行了。
其實between這個關鍵字,在MySQL中也不過是大小比較的縮寫語法糖。那么就可以把程序寫成下面這樣:
$reservations = Reservation::where(reservation_from, >=, $from) ->where(reservation_from, <=, $to) ->get();
本文通過3種寫法實現了對于日期之間的SQL查詢,我們建議使用SQL語句的限制,將篩選的結果精準返回,然后做進一步操作。laravel雖然提供了集合操作,但是在數據庫側效率并不高,所以不提倡全量查詢,集合篩選這樣的操作。
Happy coding :-)
,我是 @程序員小助手 ,持續分享編程知識,歡迎關注。
下一篇:紅娘是哪一部作品中的人物
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖