web-dev-qa-db-fra.com

Générer la requête brute MySQL à partir de Laravel Query Builder

Comment puis-je obtenir la requête mysql d'une requête laravel

Convertir:

App\User::where('balance','>',0)->where(...)->get();

À:

SELECT * FROM users WHERE `balance`>0 and ...
13
Saeed Vaziry

utilisez la méthode toSql() de laravel pour que la requête soit exécutée comme

App\User::where('balance','>',0)->where(...)->toSql();

Mais Laravel ne vous montrera pas les paramètres dans votre requête, car ils sont liés après la préparation de la requête. Pour obtenir les paramètres de liaison, utilisez cette

$query=App\User::where('balance','>',0)->where(...);
print_r($query->getBindings() );

activez le journal de requête en tant que DB::enableQueryLog() et affichez à l'écran les dernières requêtes exécutées. Vous pouvez l'utiliser

dd(DB::getQueryLog());
27
RAUSHAN KUMAR

vous pouvez ajouter cette fonction à vos assistants

function getRealQuery($query, $dumpIt = false)
{
    $params = array_map(function ($item) {
        return "'{$item}'";
    }, $query->getBindings());
    $result = str_replace_array('\?', $params, $query->toSql());
    if ($dumpIt) {
        dd($result);
    }
    return $result;
}

et utiliser comme ceci:

getRealQuery(App\User::where('balance','>',0)->where(...),true)
4
honarkhah

Au lieu d'interférer avec l'application avec des instructions d'impression ou "dds", je procède comme suit lorsque je souhaite afficher le code SQL généré:

DB::listen(function ($query) { 
    Log::info($query->sql, $query->bindings);
});

// (DB and Log are the facades in Illuminate\Support\Facades namespace)

Cela générera le SQL dans le journal Laravel (situé à storage/logs/laravel.log). Une commande utile pour suivre les écritures dans ce fichier est 

tail -n0 -f storage/logs/laravel.log
2
alepeino

Un moyen simple d'afficher toutes les requêtes utilisées dans Laravel sans aucune modification du code consiste à installer LaravelDebugBar ( https://laravel-news.com/laravel-debugbar ).

Dans le cadre de cette fonctionnalité, vous obtenez un onglet qui affiche toutes les requêtes utilisées par une page.

2
Nigel Ren

Pour imprimer la requête sql brute, essayez:

DB::enableQueryLog();
// Your query here
$queries = DB::getQueryLog();
print_r($queries);

Référence

2
Mayank Pandeyz

Pour obtenir une requête mysql dans laravel, vous devez enregistrer votre requête en tant que

DB::enableQueryLog();
App\User::where('balance','>',0)->where(...)->get();
print_r(DB::getQueryLog());

Vérifier la référence: https://laravel.com/docs/5.0/database#query-logging

1
Rahul

Méthode 1

Pour imprimer une seule requête, utilisez la méthode toSql () de laravel pour que la requête soit exécutée comme

App\User::where('balance','>',0)->where(...)->toSql();

Méthode 2

Laravel peut éventuellement enregistrer en mémoire toutes les requêtes exécutées pour la requête en cours. Toutefois, dans certains cas, par exemple lors de l'insertion d'un grand nombre de lignes, l'application peut utiliser une quantité de mémoire excédentaire, vous devez donc éviter cela. 

Pour activer le journal, vous pouvez utiliser la méthode enableQueryLog comme

DB::connection()->enableQueryLog();

Pour obtenir un tableau des requêtes exécutées, vous pouvez utiliser la méthode getQueryLog comme

$queries = DB::getQueryLog();

vous pouvez obtenir plus de détails ici Laravel Activer le journal des requêtes

Méthode 3

Une autre approche permettant d’afficher toutes les requêtes utilisées dans Laravel sans activer le journal des requêtes consiste à installer le LaravelDebugBar à partir d’ici Laravel Debug Bar . pendant le développement.

1
gaurav

Dans Laravel 5.4 (je n'ai pas vérifié cela dans d'autres versions), ajoutez cette fonction dans le fichier "App" => "Fournisseurs" => "AppServiceProvider.php".

public function boot()
{

    if (App::isLocal()) {

        DB::listen(
            function ($sql) {
                // $sql is an object with the properties:
                //  sql: The query
                //  bindings: the sql query variables
                //  time: The execution time for the query
                //  connectionName: The name of the connection

                // To save the executed queries to file:
                // Process the sql and the bindings:
                foreach ($sql->bindings as $i => $binding) {
                    if ($binding instanceof \DateTime) {
                        $sql->bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
                    } else {
                        if (is_string($binding)) {
                            $sql->bindings[$i] = "'$binding'";
                        }
                    }
                }

                // Insert bindings into query
                $query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql);

                $query = vsprintf($query, $sql->bindings);

                // Save the query to file
                /*$logFile = fopen(
                    storage_path('logs' . DIRECTORY_SEPARATOR . date('Y-m-d') . '_query.log'),
                    'a+'
                );*/
                Log::notice("[USER] $query");
            }
        );
    }
}

Après cette installation, https://github.com/ARCANEDEV/LogViewer Vous pourrez ainsi voir toutes les requêtes SQL exécutées sans modifier le code. 

1
Roshan Perera

Voici une fonction d'assistance qui vous indique le dernier SQL exécuté. 

use DB;
public static function getLastSQL()
{
    $queries = DB::getQueryLog();
    $last_query = end($queries);
          // last_query is the SQL with with data binding like 
          //   { 
          //       select ? from sometable where field = ? and field2 = ? ;
          //       param1,
          //       param2,
          //       param3,
          //   }
          //   which is hard to read.
    $last_query = bindDataToQuery($last_query);     
          // here, last_query is the last SQL you have executed as normal SQL
          //     select param1 from sometable where field=param2 and field2 = param3;
    return $last_query
}

Voici la fonction bindDataToQuery, qui remplit le '?' des blancs avec de vrais params.

protected static function bindDataToQuery($queryItem){
    $query = $queryItem['query'];
    $bindings = $queryItem['bindings'];
    $arr = explode('?',$query);
    $res = '';
    foreach($arr as $idx => $ele){
        if($idx < count($arr) - 1){
            $res = $res.$ele."'".$bindings[$idx]."'";
        }
    }
    $res = $res.$arr[count($arr) -1];
    return $res;
}
1
jetwaves