Laravel の Eloquent Builder でパラメータを生のクエリに正しくバインドするにはどうすればよいですか?

DDD
リリース: 2024-11-23 09:00:17
オリジナル
553 人が閲覧しました

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

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート