Maison >base de données >tutoriel mysql >Comment lier correctement les paramètres dans les requêtes brutes complexes dans Laravel ?

Comment lier correctement les paramètres dans les requêtes brutes complexes dans Laravel ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-28 03:08:14958parcourir

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

Requêtes avec des liaisons : une solution pratique dans Laravel

Lorsque vous travaillez avec des requêtes de base de données brutes complexes dans Laravel, la liaison des paramètres est cruciale pour éviter les erreurs. Cette situation se produit souvent lors de l'utilisation d'une approche basée sur un modèle.

Considérez la requête suivante rencontrée par un utilisateur :

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

Cette requête tente de filtrer les propriétés en fonction de leur distance par rapport à un point donné. en utilisant un calcul SQL brut. Cependant, une erreur se produit en raison de paramètres nommés et positionnels mixtes.

Pour résoudre ce problème, il convient d'exploiter la méthode setBindings, qui permet de spécifier explicitement les liaisons de la requête. Voici le code modifié et fonctionnel :

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

En utilisant des espaces réservés positionnels (?) dans le SQL brut et en appelant setBindings avec le tableau de valeurs approprié, la requête est exécutée correctement, en liant les paramètres aux espaces réservés appropriés. .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn