Faire exécuter la requête dans Laravel 3/4


182

Comment puis-je récupérer la requête SQL exécutée brute dans Laravel 3/4 à l'aide de Laravel Query Builder ou Eloquent ORM?

Par exemple, quelque chose comme ceci:

DB::table('users')->where_status(1)->get();

Ou:

(posts (id, user_id, ...))

User::find(1)->posts->get();

Sinon, comment puis-je au moins enregistrer toutes les requêtes exécutées dans laravel.log?


qu'en est-il de laravel 5?
Chaudhry Waqas

Réponses:


318

Laravel 4+

Dans Laravel 4 et versions ultérieures, vous devez appeler DB::getQueryLog()pour obtenir toutes les requêtes exécutées.

$queries = DB::getQueryLog();
$last_query = end($queries);

Ou vous pouvez télécharger un package de profileur. Je recommanderais barryvdh / laravel-debugbar , qui est plutôt chouette . Vous pouvez lire pour obtenir des instructions sur la façon d'installer dans leur référentiel .

Remarque pour les utilisateurs de Laravel 5: vous devrez appeler DB::enableQueryLog()avant d'exécuter la requête. Soit juste au-dessus de la ligne qui exécute la requête, soit à l'intérieur d'un middleware.


Laravel 3

Dans Laravel 3, vous pouvez obtenir la dernière requête exécutée à partir d'un Eloquentmodèle appelant la méthode statique last_querysur la DBclasse.

DB::last_query();

Cependant, cela nécessite que vous activiez l' profileroption dans application/config/database.php. Vous pouvez également, comme @dualed l'a mentionné, activer l' profileroption, in application/config/application.phpor call DB::profile()pour que toutes les requêtes soient exécutées dans la requête actuelle et leur heure d'exécution.


2
Votre code pour Laravel 4 ne fonctionne pas. J'obtiens ceci ErrorException: Attention: call_user_func_array()s'attend à ce que le paramètre 1 soit un rappel valide, la classe Illuminate\Database\MySqlConnectionn'a pas de méthode getQueryList.
dualité_

Mon mauvais, la bonne méthode est getQueryLog. Corrigé maintenant. Merci!
rmobis

Étrange ... J'obtiens last_query () n'est pas défini sur l'erreur d'objet de requête. Je fais simplement appel à un modèle éloquent non fondé.
Aditya MP

1
Pour Laravel 3, c'est en fait DB :: last_query (); Vous devez également définir 'profile' sur true dans votre application / config / database.php
Dan Smart

4
Cela ne semble pas fonctionner pour un modèle éloquent sur L4. Lorsque j'exécute Model :: find ($ id) et que j'exécute DB :: getQueryLog (), je renvoie un tableau vide (). Une idée comment obtenir les requêtes pour un modèle éloquent?
Abishek

31

Vous pouvez activer le " Profiler " dans Laravel 3 en définissant

'profiler' => true,

Dans votre application/config/application.phpetapplication/config/database.php

Cela active une barre au bas de chaque page. L'une de ses fonctionnalités est de répertorier les requêtes exécutées et la durée de chacune d'entre elles.

entrez la description de l'image ici


14
Notez que dans Laravel 4, le Profiler n'est pas inclus, vous devez l'installer vous-même (par exemple en utilisant composer). Voir cette question SO .
duality_

1
C'est discuté dans la première réponse .
duality_

24

Pour Eloquent, vous pouvez simplement faire:

$result->getQuery()->toSql();

Mais vous devez supprimer la partie "-> get ()" de votre requête.


17

Je recommanderais d'utiliser l'extension Chrome Clockwork avec le package Laravel https://github.com/itsgoingd/clockwork . C'est facile à installer et à utiliser.

Clockwork est une extension Chrome pour le développement PHP, étendant les outils de développement avec un nouveau panneau fournissant toutes sortes d'informations utiles pour le débogage et le profilage de vos scripts PHP, y compris les informations sur demande, les en-têtes, les données GET et POST, les cookies, les données de session, les requêtes de base de données, itinéraires, visualisation de l'exécution de l'application et plus encore. Clockwork inclut une prise en charge immédiate des applications basées sur Laravel 4 et Slim 2, vous pouvez ajouter la prise en charge de tout autre framework ou de tout autre framework personnalisé via une API extensible.

entrez la description de l'image ici


16

Puisque le profileur n'est pas encore sorti dans Laravel 4 , j'ai créé cette fonction d'assistance pour voir le SQL généré:

    fonction statique publique q ($ all = true) 
    {
        $ queries = DB :: getQueryLog ();

        if ($ all == false) {
            $ last_query = end ($ requêtes);
            return $ last_query;
        }

        retourne $ queries;
    }

REMARQUE : définissez l' indicateur $ all sur false si vous souhaitez uniquement la dernière requête SQL.

Je garde ce type de fonctions dans une classe appelée DBH.php (abréviation de Database Helper) afin que je puisse l'appeler de n'importe où comme ceci:

dd(DBH::q()); 

Voici le résultat que j'obtiens: entrez la description de l'image ici

Au cas où vous vous poseriez la question, j'utilise Kint pour le formatage dd (). http://raveren.github.io/kint/


1
if($all == false)? Pourquoi pas simplementif(!$all)
toesslab


14

Voici un extrait de code Javascript rapide que vous pouvez ajouter à votre modèle de page maître. Tant qu'elle est incluse, toutes les requêtes seront envoyées à la console Javascript de votre navigateur. Il les imprime dans une liste facilement lisible, ce qui facilite la navigation sur votre site et la visualisation des requêtes en cours d'exécution sur chaque page.

Lorsque vous avez terminé le débogage, supprimez-le simplement de votre modèle.

<script type="text/javascript">
    var queries = {{ json_encode(DB::getQueryLog()) }};
    console.log('/****************************** Database Queries ******************************/');
    console.log(' ');
    queries.forEach(function(query) {
        console.log('   ' + query.time + ' | ' + query.query + ' | ' + query.bindings[0]);
    });
    console.log(' ');
    console.log('/****************************** End Queries ***********************************/');
</script>

Je pense que vous auriez besoin de "" autour de la partie {{json_encode ...}}
mydoglixu

@mydoglixu Puisque DB::getQueryLog()renvoie un tableau, il n'est pas nécessaire de l'entourer de "". json_encodele traduira en conséquence.
rmobis

@mobis - Je voulais dire que vous avez besoin du "" en dehors de {{...}} pour que javascript ne génère pas d'erreur. comme ceci: var queries = "json output";
mydoglixu

@mydoglixu Vous ne le faites pas, car un tableau (ou un objet) JSON est du JavaScript valide. Cela se briserait si vous le faisiez.
rmobis

@mobis - oh yeah, duh
mydoglixu

10

Laravel 5

Notez qu'il s'agit de l' approche procédurale , que j'utilise pour un débogage rapide

    DB::enableQueryLog();

    // Run your queries
    // ...

    // Then to retrieve everything since you enabled the logging:
    $queries = DB::getQueryLog();
    foreach($queries as $i=>$query)
    {
        Log::debug("Query $i: " . json_encode($query));
    }

dans votre en-tête, utilisez:

     use DB;
     use Illuminate\Support\Facades\Log;

La sortie ressemblera à ceci (le fichier journal par défaut est laravel.log ):

[2015-09-25 12:33:29] testing.DEBUG: Requête 0: {"query": "select * from 'users' where ('user_id' =?)", "Bindings": ["9"] , "heure": 0,23}

*** Je connais cette question spécifiée Laravel 3/4 mais cette page apparaît lors de la recherche d'une réponse générale. Les débutants à Laravel peuvent ne pas savoir qu'il existe une différence entre les versions. Étant donné que je ne vois jamais DD::enableQueryLog()mentionné dans aucune des réponses que je trouve normalement, cela peut être spécifique à Laravel 5 - peut-être que quelqu'un peut commenter cela.


7

Vous pouvez également écouter les événements de requête en utilisant ceci:

DB::listen(function($sql, $bindings, $time)
{
    var_dump($sql);
});

Consultez les informations de la documentation ici sous Écoute des événements de requête


6

L'utilisation du journal des requêtes ne vous donne pas la requête RAW réelle en cours d'exécution, en particulier s'il existe des valeurs liées. C'est la meilleure approche pour obtenir le SQL brut:

DB::table('tablename')->toSql();

ou plus impliqué:

$query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
dd($query);

5

Si vous utilisez Laravel 5, vous devez l'insérer avant la requête ou sur le middleware:

\DB::enableQueryLog();


3

dans Laravel 4, vous pouvez en fait utiliser un écouteur d'événements pour les requêtes de base de données.

Event::listen('illuminate.query', function($sql, $bindings)
{
    foreach ($bindings as $val) {
        $sql = preg_replace('/\?/', "'{$val}'", $sql, 1);
    }

    Log::info($sql);
});

Placez cet extrait n'importe où, par exemple dans start/global.php. Il écrira les requêtes dans le journal d'informations ( storage/log/laravel.log).


3
Event::listen('illuminate.query', function($sql, $param)
{
    \Log::info($sql . ", with[" . join(',', $param) ."]<br>\n");
});

mettez-le dans global.php il enregistrera votre requête SQL.


2

Le profileur Loic Sharma SQL prend en charge Laravel 4, je viens de l'installer. Les instructions sont répertoriées ici . Les étapes sont les suivantes:

  1. Ajoutez "loic-sharma/profiler": "1.1.*"la section require dans composer.json
  2. Effectuez l'auto-mise à jour => php composer.phar self-updatedans la console.
  3. Effectuez également la mise à jour du compositeur => php composer.phar update loic-sharma/profilerdans la console `
  4. Ajouter 'Profiler\ProfilerServiceProvider',le tableau de fournisseurs dans app.php
  5. Ajoutez également 'Profiler' => 'Profiler\Facades\Profiler',le tableau d'aliasses dans app.php
  6. Exécuter php artisan config:publish loic-sharma/profilerdans la console

2

Impression de la dernière requête

$queries = \DB::getQueryLog();
$last_query = end($queries);

// Add binding to query
foreach ($last_query['bindings'] as $val) {
        $last_query['query'] = preg_replace('/\?/', "'{$val}'", $last_query['query'], 1);
}
dd($last_query);


0

Laravel 3

Une autre façon de procéder est:

#config/database.php

'profiler' => true

Pour le résultat de toutes les requêtes:

print_r(DB::profiler());

Pour le dernier résultat:

print_r(DB::last_query());

0

Pour obtenir la dernière requête exécutée dans laravel, nous utiliserons la DB::getQueryLog()fonction de laravel pour renvoyer toutes les requêtes exécutées. Pour obtenir la dernière requête, nous utiliserons la end()fonction qui renvoie la dernière requête exécutée.

$student = DB::table('student')->get();
$query = DB::getQueryLog();
$lastQuery = end($query);
print_r($lastQuery);

J'ai pris référence à http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php .


Votre réponse ne semble pas apporter de nouvelles connaissances à ce que couvre déjà la réponse acceptée par Raphael_.
Jaak Kütt

0

Il existe un moyen très simple de le faire, à partir de votre requête laravel, renommez simplement n'importe quel nom de colonne, cela vous montrera une erreur avec votre requête .. :)


Voie de piratage rapide. Pas trop utile en production, mais en mode développement, c'est bien dans certains cas.
au lieu
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.