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();
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();
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!