web-dev-qa-db-fra.com

Obtenez la requête exécutée dans Laravel 3/4

Comment puis-je récupérer la requête SQL brute exécutée dans Laravel 3/4 en utilisant 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 minimum sauvegarder toutes les requêtes exécutées sur laravel.log?

176
Patrick Maciel

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 , ce qui est plutôt chouette. Vous pouvez lire les instructions pour savoir comment installer dans leur référentiel .

Remarque pour Laravel 5 utilisateurs: Vous devez appeler DB::enableQueryLog() avant d'exécuter la requête. Juste au-dessus de la ligne qui exécute la requête ou dans un middleware.


Laravel 3

Dans Laravel 3, vous pouvez obtenir la dernière requête exécutée à partir d'un modèle Eloquent appelant la méthode statique last_query sur la classe DB.

DB::last_query();

Cela nécessite toutefois d'activer l'option profiler dans application/config/database.php. Vous pouvez également, comme @dualed mentionné, activer l'option profiler dans application/config/application.php ou appeler DB::profile() pour que toutes les requêtes soient exécutées dans la demande en cours et leur temps d'exécution.

316
rmobis

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

'profiler' => true,

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

Cela active une barre au bas de chaque page. L’une de ses caractéristiques est la liste des requêtes exécutées et la durée de chacune d’elles.

enter image description here

31
dualed

Pour Eloquent, vous pouvez simplement faire:

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

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

24
JamesPlayer

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 de 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 des informations. sur demande, en-têtes, données GET et POST, cookies, données de session, requêtes de base de données, itinéraires, visualisation de l'exécution de l'application, etc. Clockwork inclut une prise en charge immédiate pour les applications basées sur Laravel 4 et Slim 2; vous pouvez ajouter une prise en charge de tout framework autre ou personnalisé via une API extensible.

enter image description here

17
Znarkus

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

 
 fonction statique publique q ($ all = true) 
 {
 $ requêtes = DB :: getQueryLog (); 
 
 if ($ all == false) {
 $ last_query = end ($ requêtes); 
 return $ last_query; 
} 
 
 return $ requêtes; 
} 
 

NOTE: définit le drapeau $ all sur false si vous ne voulez que la dernière requête SQL.

Je garde ce genre de fonctions dans une classe appelée DBH.php (abréviation de Database Helper) pour pouvoir l'appeler de n'importe où comme ceci:

dd(DBH::q()); 

Voici la sortie que je reçois: enter image description here

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

16
Ricardo Rossi

Pour Laraver 4 c'est

DB::getQueryLog()
14
misaizdaleka

Voici un extrait de code Javascript que vous pouvez ajouter à votre modèle de page maître. Tant qu'elle est incluse, toutes les requêtes seront envoyées sur la console Javascript de votre navigateur. Il les imprime dans une liste facilement lisible, ce qui facilite la navigation sur votre site et les tâches exécutées 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>
14
Adam

Laravel 5

Notez qu'il s'agit de l'approche procédurale que j'utilise pour le 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 de log par défaut est laravel.log):

[2015-09-25 12:33:29] testing.DEBUG: Requête 0: {"requête": "sélection * de 'utilisateurs' où ('utilisateur_id' =?)", "Liaisons": ["9"] , "heure": 0,23}

*** Je sais que cette question a été 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 de Laravel peuvent ne pas savoir qu’il existe une différence entre les versions. Puisque je ne vois jamais DD::enableQueryLog() mentionné dans aucune des réponses que je trouve normalement, il peut être spécifique à Laravel 5 - Peut-être que quelqu'un peut commenter à ce sujet.

10
Bryan

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

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

Voir les informations de la documentation ici sous Écoute d'événements de requête

7
SnapShot

L'utilisation du journal des requêtes ne vous donne pas la requête RAW en cours d'exécution, surtout 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);
6
omar j

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

\DB::enableQueryLog();
5
Mandeep Gill

Ou comme alternative à laravel 3 profileur, vous pouvez utiliser:

https://github.com/paulboco/profiler ou https://github.com/barryvdh/laravel-debugbar

4
karelv

dans Laravel 4, vous pouvez réellement 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. Les requêtes seront écrites dans le journal d'informations (storage/log/laravel.log).

3
aebersold
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.

3
Christland

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

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

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);
2
Dulitha Kumarasiri

L4 one-liner

(qui écrit la requête):

$q=\DB::getQueryLog();dd(end($q));

1
Kamil Kiełczewski

Il existe un moyen très simple de le faire: à partir de votre requête laravel, renommez n'importe quel nom de colonne, il affichera une erreur lors de votre requête .. :)

0
Aamir

Laravel 3

Une autre façon de faire est:

#config/database.php

'profiler' => true

Pour toutes les requêtes:

print_r(DB::profiler());

Pour le dernier résultat:

print_r(DB::last_query());
0
Wallace Maxters

Pour obtenir la dernière requête exécutée dans laravel, nous allons utiliser DB::getQueryLog() fonction de laravel il renverra toutes les requêtes exécutées. Pour obtenir la dernière requête, nous allons utiliser la fonction end() 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 .

0
Manish