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!