Étant donné le code suivant:
DB::table('users')->get();
Je veux obtenir la chaîne de requête SQL brute que le générateur de requêtes de base de données ci-dessus va générer. Dans cet exemple, ce serait SELECT * FROM users
.
Comment puis-je faire cela?
echo User::where('status', 1)->toSql();
Réponses:
Pour afficher à l'écran les dernières requêtes exécutées, vous pouvez utiliser ceci:
Je pense que les requêtes les plus récentes seront au bas du tableau.
Vous aurez quelque chose comme ça:
(Merci au commentaire de Joshua ci-dessous.)
la source
Log
Log::debug(DB::getQueryLog())
DB::enableQueryLog();
DB::enableQueryLog(); dd(DB::getQueryLog());
Mais ça revient juste[]
....DB::connection('database')->getQueryLog()
Utilisez la
toSql()
méthode sur uneQueryBuilder
instance.DB::table('users')->toSql()
retournerais:C'est plus facile que de câbler un écouteur d'événements, et vous permet également de vérifier à quoi ressemblera la requête à tout moment pendant que vous la construisez.
la source
getBindings
méthode. Cela retournera les liaisons afin qu'elles soient liées à l'instruction SQL.$query = \DB::table('users')->where('id', 10); $sql = str_replace_array('?', $query->getBindings(), $query->toSql()); dd($sql);
DB::QueryLog()
ne fonctionne qu'après avoir exécuté la requête$builder->get()
. si vous souhaitez obtenir la requête avant d'exécuter la requête, vous pouvez utiliser la$builder->toSql()
méthode. voici l'exemple pour obtenir le sql et le lier:OU faites simplement votre erreur de requête comme appeler une table ou une colonne inexistante, vous verrez la requête générée dans l'exception XD
la source
$query = vsprintf(str_replace(array('?'), array('\'%s\''), $builder->toSql()), $builder->getBindings());
LIKE
requête ou lors du formatage des dates. Vous devrez d'abord échapper à ces premiers avec des signes de double pour cent.$builder->getBindings()
?Vous pouvez écouter l'événement «illuminate.query». Avant la requête, ajoutez l'écouteur d'événement suivant:
Cela imprimera quelque chose comme:
la source
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Event;
vous, vous pouvez simplement le faireuse Event;
car c'est une façade .Si vous essayez d'obtenir le journal en utilisant Illuminate sans utiliser Laravel:
Vous pouvez également créer une fonction rapide comme ceci:
ÉDITER
les versions mises à jour semblent avoir la journalisation des requêtes désactivée par défaut (ce qui précède renvoie un tableau vide). Pour réactiver, lors de l'initialisation du gestionnaire de capsules, récupérez une instance de la connexion et appelez la
enableQueryLog
méthodeMODIFIER ENCORE
En tenant compte de la question réelle, vous pouvez réellement effectuer les opérations suivantes pour convertir la requête unique actuelle au lieu de toutes les requêtes précédentes:
la source
'US/Eastern'
.quick function
. Je crois que le code sous-jacent utilisera les méthodes prepare ( php.net/manual/en/mysqli.prepare.php ), c'est pourquoi juste la?
est requise. Vous pouvez php.net/manual/en/function.is-numeric.php pour déterminer s'il faut encapsuler ou non l'entrée dans des guillemets simples.is_numeric
idée), et ça marche! J'aime cela. Je vous remercie.Il existe une méthode éloquente pour obtenir la chaîne de requête.
toSql ()
dans notre cas,
revenir
est la solution exacte qui renvoie la chaîne de requête SQL. J'espère que cela sera utile ...
la source
->where('foo', '=', 'bar')
bar ne montrera pas dans le sqlla source
->toSql()
comme vous le feriez s'il y a plus d'arguments après le modèle. par exempleUser::where('id', 1)->toSql()
Si vous utilisez laravel 5.1 et MySQL, vous pouvez utiliser cette fonction faite par moi:
En tant que paramètre d'entrée, vous pouvez utiliser l'un de ces paramètres
la source
Vous devez d'abord activer le journal des requêtes en appelant:
après des requêtes utilisant la façade DB, vous pouvez écrire:
la sortie aimera ci-dessous:
la source
C'est la meilleure solution que je puisse suggérer à quiconque pour le débogage de la dernière requête éloquente ou de la requête finale, bien que cela ait également été discuté:
la source
Première voie:
Vous pouvez simplement faire les choses suivantes en utilisant la
toSql()
méthode,Si cela ne fonctionne pas, vous pouvez configurer la chose à partir de la documentation de laravel .
Deuxième voie:
Une autre façon de procéder est
DB::getQueryLog()
mais s'il renvoie un tableau vide, il est désactivé par défaut, visitez ceci ,
il suffit d'activer avec
DB::enableQueryLog()
et cela fonctionnera :)pour plus d'informations, visitez Github Issue pour en savoir plus.
J'espère que cela aide :)
la source
Un remplacement «macroable» pour obtenir la requête SQL avec les liaisons.
Ajouter la fonction macro ci-dessous dans la méthode.
AppServiceProvider
boot()
Ajoutez un alias pour Eloquent Builder. ( Laravel 5.4+ )
Déboguez ensuite comme d'habitude. ( Laravel 5.4+ )
Par exemple, Query Builder
Par exemple, Eloquent Builder
Par exemple Eloquent Builder ( Laravel 5.1 - 5.3 )
la source
utiliser le package debugbar
la source
De laravel
5.2
et au- delà . vous pouvez utiliserDB::listen
pour obtenir des requêtes exécutées.Ou si vous souhaitez déboguer une seule
Builder
instance, vous pouvez utiliser latoSql
méthode.la source
Le moyen le plus simple consiste à commettre une erreur délibérée . Par exemple, je veux voir la requête SQL complète de la relation suivante:
Je viens de faire une colonne pour ne pas être trouvée, ici je choisis
created_at
et je l'ai modifiéecreated_ats
en ajoutant la fins
à:Ainsi, le débogueur renverra l'erreur suivante:
Le message d'erreur ci-dessus renvoie la requête SQL complète avec l'erreur
Maintenant, supprimez simplement le supplément
s
de created_at et testez ce SQL comme vous le souhaitez dans n'importe quel éditeur SQL tel que l'éditeur SQL phpMyAdmin!la source
:id
Pour voir la requête exécutée par Laravel, utilisez le journal des requêtes de Laravel
la source
A partir de Laravel 5.8.15 le générateur de requêtes a maintenant
dd
etdump
méthodes afin que vous puissiez fairela source
C'est la fonction que j'ai placée dans ma classe de modèle de base. Passez simplement l'objet générateur de requêtes dedans et la chaîne SQL sera retournée.
la source
À mon avis, ce sera la meilleure approche en tant que débutant:
Ceci est également illustré ici. https://stackoverflow.com/a/59207557/9573341
la source
Pour laravel 5.5.X
Si vous souhaitez recevoir chaque requête SQL exécutée par votre application, vous pouvez utiliser la méthode listen. Cette méthode est utile pour la journalisation des requêtes ou le débogage. Vous pouvez enregistrer votre écouteur de requêtes chez un fournisseur de services:
La source
la source
Ajoutez cette fonction à votre application et appelez simplement.
Sortie : "sélectionnez * d'
user
oùlang
= 'en' etstatus
= '1' ordre parupdated_at
desc limite 25 offset 0"la source
Vous pouvez utiliser ce package pour obtenir toutes les requêtes qui s'exécutent lorsque vous chargez votre page
la source
Imprimer la dernière requête
la source
Si vous n'utilisez pas Laravel mais utilisez le package Eloquent alors:
la source
vous pouvez utiliser le mouvement d'horlogerie
mais fonctionne aussi dans firefox
la source
J'ai créé quelques fonctions simples pour obtenir le SQL et les liaisons de certaines requêtes.
Usage:
la source
Autant que j'aime ce cadre, je déteste quand il agit comme de la merde.
DB::enableQueryLog()
est totalement inutile.DB::listen
est également inutile. Cela a montré une partie de la requête lorsque j'ai dit$query->count()
, mais si je le fais$query->get()
, cela n'a rien à dire.La seule solution qui semble fonctionner de manière cohérente consiste à mettre intentionnellement une syntaxe ou une autre erreur dans les paramètres ORM, comme un nom de colonne / table inexistant, à exécuter votre code sur la ligne de commande en mode débogage, et il crachera l'erreur SQL avec la requête frickin complète enfin. Sinon, nous espérons que l'erreur apparaîtra dans le fichier journal si elle est exécutée à partir du serveur Web.
la source
Si vous utilisez le bricoleur et que vous souhaitez enregistrer la requête SQL formée, vous pouvez le faire
la source
Essaye ça:
Remarque: get () a été remplacé par toSql () pour afficher la requête SQL brute.
la source
Ma façon de faire cela, basée sur la vue du journal, n'a qu'à modifier le fichier
app/Providers/AppServiceProvider.php
:app/Providers/AppServiceProvider.php
storage/logs/laravel-2019-10-27.log
:la source