首頁  >  文章  >  資料庫  >  如何在 Laravel 的 Eloquent Builder 中正確地將參數綁定到原始查詢?

如何在 Laravel 的 Eloquent Builder 中正確地將參數綁定到原始查詢?

DDD
DDD原創
2024-11-23 09:00:17554瀏覽

How to Correctly Bind Parameters to Raw Queries in Laravel's Eloquent Builder?

在Laravel 的Eloquent Builder 中將參數綁定到原始查詢

在Laravel 的Eloquent 模型建構器中使用原始資料庫時,可能很難正確綁定參數。嘗試在同一查詢中同時使用位置參數和命名參數時會出現一個常見問題。

問題中提供的查詢說明了此問題:

Property::select(
    DB::raw("title, lat, lng, (
            3959 * acos( 
                cos( radians(:lat) ) * 
                cos( radians( lat ) ) * 
                cos( radians( lng ) - radians(:lng) ) + 
                sin( radians(:lat) ) * 
                sin( radians( lat ) ) 
            ) 
        ) AS distance", ["lat" => $lat, "lng" => $lng, "lat" => $lat])
)
->having("distance", "<", $radius)
->orderBy("distance")
->take(20)
->get();

執行後,此查詢失敗並顯示錯誤「參數號無效:混合命名和位置參數。」

要解決此問題,必須綁定明確使用setBindings() 方法的參數。此方法會依照參數在查詢中出現的順序接受參數陣列。

以下是使用setBindings() 方法修改後的查詢:

Property::select(
    DB::raw("title, lat, lng, (
            3959 * acos( 
                cos( radians(  ?  ) ) *
                cos( radians( lat ) ) * 
                cos( radians( lng ) - radians(?) ) + 
                sin( radians(  ?  ) ) *
                sin( radians( lat ) ) 
            )
       ) AS distance")
)
->having("distance", "<", "?")
->orderBy("distance")
->take(20)
->setBindings([$lat, $lng, $lat, $radius])
->get();

透過使用setBindings()方法正確,現在可以成功執行查詢,將參數綁定到原始SQL 中的適當佔位符。

以上是如何在 Laravel 的 Eloquent Builder 中正確地將參數綁定到原始查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn