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?
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.
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.
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.
Pour Eloquent, vous pouvez simplement faire:
$result->getQuery()->toSql();
Mais vous devez supprimer la partie "-> get ()" de votre requête.
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.
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:
Au cas où vous vous le demanderiez, j'utilise Kint pour le formatage dd (). http://raveren.github.io/kint/
Pour Laraver 4 c'est
DB::getQueryLog()
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>
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.
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
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);
Si vous utilisez Laravel 5, vous devez l'insérer avant la requête ou sur le middleware:
\DB::enableQueryLog();
Ou comme alternative à laravel 3 profileur, vous pouvez utiliser:
https://github.com/paulboco/profiler ou https://github.com/barryvdh/laravel-debugbar
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
).
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.
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:
"loic-sharma/profiler": "1.1.*"
dans la section require de composer.jsonphp composer.phar self-update
dans la console.php composer.phar update loic-sharma/profiler
dans la console également `'Profiler\ProfilerServiceProvider',
dans le tableau de fournisseurs dans app.php'Profiler' => 'Profiler\Facades\Profiler',
dans le tableau aliasses dans app.php égalementphp artisan config:publish loic-sharma/profiler
dans la consoleDerniè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);
(qui écrit la requête):
$q=\DB::getQueryLog();dd(end($q));
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 .. :)
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());
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 .