在Laravel 中處理複雜的原始資料庫查詢時,綁定參數對於防止錯誤至關重要。使用基於模型的方法時經常會出現這種情況。
考慮使用者遇到的以下查詢:
$property = 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();
此查詢嘗試根據屬性與給定點的距離來過濾屬性使用原始 SQL 計算。但是,由於混合命名參數和位置參數,會出現錯誤。
要解決此問題,應該利用 setBindings 方法,該方法允許明確指定查詢的綁定。以下是修改後的工作代碼:
$property = 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();
透過在原始SQL 中使用位置佔位符(?) 並使用適當的值數組呼叫setBindings,可以正確執行查詢,將參數綁定到適當的佔位符.
以上是如何在 Laravel 中的複雜原始查詢中正確綁定參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!