Heim  >  Artikel  >  Datenbank  >  Wie binde ich Parameter korrekt an Rohabfragen im Eloquent Builder von Laravel?

Wie binde ich Parameter korrekt an Rohabfragen im Eloquent Builder von Laravel?

DDD
DDDOriginal
2024-11-23 09:00:17558Durchsuche

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

Binden von Parametern an Rohabfragen im Eloquent Builder von Laravel

Die Verwendung einer Rohdatenbankabfrage im Eloquent Model Builder von Laravel kann schwierig sein Parameter korrekt binden. Ein häufiges Problem tritt auf, wenn versucht wird, sowohl Positions- als auch benannte Parameter innerhalb derselben Abfrage zu verwenden.

Die in der Frage bereitgestellte Abfrage veranschaulicht dieses Problem:

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

Bei der Ausführung schlägt diese Abfrage mit fehl der Fehler „Ungültige Parameternummer: gemischte benannte und positionelle Parameter.“

Um dieses Problem zu beheben, müssen die Parameter explizit gebunden werden mit der setBindings()-Methode. Diese Methode akzeptiert ein Array der Parameter in der Reihenfolge, in der sie in der Abfrage erscheinen.

Hier ist die geänderte Abfrage mit der setBindings()-Methode:

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 Verwendung von setBindings() Wenn Sie die Methode korrekt ausführen, kann die Abfrage nun erfolgreich ausgeführt werden, wobei die Parameter an die entsprechenden Platzhalter im Roh-SQL gebunden werden.

Das obige ist der detaillierte Inhalt vonWie binde ich Parameter korrekt an Rohabfragen im Eloquent Builder von Laravel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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