web-dev-qa-db-de.com

Generieren Sie die Raw MySQL-Abfrage mit dem Laravel Query Builder

Wie kann ich mysql-Abfrage einer laravel-Abfrage erhalten?

Konvertieren:

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

An:

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

verwenden Sie die toSql()-Methode von laravel, um die Abfrage wie ausgeführt auszuführen

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

Laravel zeigt Ihnen jedoch keine Parameter in Ihrer Abfrage an, da diese nach der Vorbereitung der Abfrage gebunden sind. Verwenden Sie diesen Befehl, um die Bind-Parameter abzurufen

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

aktivieren Sie das Abfrageprotokoll als DB::enableQueryLog() und geben Sie dann auf dem Bildschirm die zuletzt durchgeführten Abfragen aus.

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

sie können diese Funktion Ihren Helfern hinzufügen

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;
}

und wie folgt verwenden:

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

Anstatt die Anwendung mit print-Anweisungen oder "dds" zu stören, mache ich Folgendes, wenn ich das generierte SQL sehen möchte:

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

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

Dadurch wird das SQL in das Laravel-Protokoll (unter storage/logs/laravel.log) ausgegeben. Ein nützlicher Befehl zum Folgen von Schreibvorgängen in diese Datei ist 

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

Eine einfache Möglichkeit, alle in Laravel verwendeten Abfragen ohne Codeänderungen anzuzeigen, ist die Installation der LaravelDebugBar ( https://laravel-news.com/laravel-debugbar ).

Als Teil der Funktionalität erhalten Sie eine Registerkarte, auf der alle Abfragen angezeigt werden, die eine Seite verwendet hat.

2
Nigel Ren

Versuchen Sie, die unformatierte SQL-Abfrage zu drucken:

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

Referenz

2
Mayank Pandeyz

Um die mysql-Abfrage in Laravel zu erhalten, müssen Sie Ihre Abfrage als protokollieren

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

Referenz überprüfen: https://laravel.com/docs/5.0/database#query-logging

1
Rahul

Methode 1

Um eine einzelne Abfrage zu drucken, verwenden Sie die toSql () - Methode von laravel, um die Abfrage wie ausgeführt auszuführen

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

Methode 2

Laravel kann optional alle Abfragen, die für die aktuelle Anforderung ausgeführt wurden, im Speicher anmelden. In einigen Fällen, z. B. beim Einfügen einer großen Anzahl von Zeilen, kann dies jedoch dazu führen, dass die Anwendung zu viel Speicher verwendet. Daher sollten Sie dies vermeiden. 

Um das Protokoll zu aktivieren, können Sie die Methode enableQueryLog als verwenden

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

Um ein Array der ausgeführten Abfragen abzurufen, können Sie die Methode getQueryLog als verwenden

$queries = DB::getQueryLog();

weitere Informationen erhalten Sie hier Laravel Enable Query Log

Methode 3

Ein weiterer Ansatz, um alle in Laravel verwendeten Abfragen anzuzeigen, ohne das Abfrageprotokoll zu aktivieren, installieren Sie LaravelDebugBar von hier Laravel Debug Bar ..__ aus. Mit diesem Paket können Sie Ihre Anwendung schnell und einfach im Auge behalten während der Entwicklung.

1
gaurav

Versuche dies:

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

Hinweis: get () wurde durch toSql () ersetzt, um die unformatierte SQL-Abfrage anzuzeigen.

1
Nikhil Gyan

Fügen Sie diese Funktion in Laravel 5.4 (in anderen Versionen nicht geprüft) in die "App" => "Providers" => "AppServiceProvider.php" ein.

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");
            }
        );
    }
}

Nach dieser Installation https://github.com/ARCANEDEV/LogViewer Sie können dann alle ausgeführten SQL-Abfragen sehen, ohne den Code bearbeiten zu müssen. 

1
Roshan Perera

Hier ist eine Hilfsfunktion, die Ihnen die zuletzt ausgeführte SQL sagt. 

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
}

Hier ist die bindDataToQuery-Funktion, die das '?' Leerzeichen mit echten 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