Maison > base de données > tutoriel mysql > le corps du texte

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

Susan Sarandon
Libérer: 2024-11-28 03:08:14
original
957 Les gens l'ont consulté

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();
Copier après la connexion

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();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal