Heim > Datenbank > MySQL-Tutorial > Hauptteil

Wie bindet man Parameter in komplexen Rohabfragen in Laravel richtig?

Susan Sarandon
Freigeben: 2024-11-28 03:08:14
Original
957 Leute haben es durchsucht

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

Abfragen mit Bindungen: Eine praktische Lösung in Laravel

Bei der Arbeit mit komplexen Rohdatenbankabfragen in Laravel sind Bindungsparameter entscheidend, um Fehler zu vermeiden. Diese Situation tritt häufig auf, wenn ein modellbasierter Ansatz verwendet wird.

Bedenken Sie die folgende Abfrage, auf die ein Benutzer stößt:

$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();
Nach dem Login kopieren

Diese Abfrage versucht, Eigenschaften basierend auf ihrer Entfernung von einem bestimmten Punkt zu filtern unter Verwendung einer reinen SQL-Berechnung. Aufgrund gemischter benannter und positioneller Parameter tritt jedoch ein Fehler auf.

Um dieses Problem zu beheben, sollte man die setBindings-Methode nutzen, die die explizite Angabe der Bindungen der Abfrage ermöglicht. Hier ist der geänderte und funktionierende Code:

$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();
Nach dem Login kopieren

Durch die Verwendung von Positionsplatzhaltern (?) im Roh-SQL und den Aufruf von setBindings mit dem entsprechenden Wertearray wird die Abfrage ordnungsgemäß ausgeführt und die Parameter an die entsprechenden Platzhalter gebunden .

Das obige ist der detaillierte Inhalt vonWie bindet man Parameter in komplexen Rohabfragen in Laravel richtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage