ホームページ > データベース > mysql チュートリアル > Laravelの複雑な生のクエリでパラメータを適切にバインドする方法は?

Laravelの複雑な生のクエリでパラメータを適切にバインドする方法は?

Susan Sarandon
リリース: 2024-11-28 03:08:14
オリジナル
985 人が閲覧しました

How to Properly Bind Parameters in Complex Raw Queries in Laravel?

バインディングを使用したクエリ: Laravel での実用的なソリューション

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

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