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 中国語 Web サイトの他の関連記事を参照してください。