Laravel の Eloquent ビルダーで生のクエリにパラメータをバインドする
Laravel の Eloquent モデル ビルダー内で生のデータベース クエリを使用する場合、次のことが難しい場合があります。パラメータを正しくバインドしてください。同じクエリ内で位置パラメータと名前付きパラメータの両方を利用しようとすると、一般的な問題が 1 つ発生します。
質問で提供されているクエリは、この問題を示しています。
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 中国語 Web サイトの他の関連記事を参照してください。