Generieren Sie die rohe MySQL-Abfrage aus Laravel Query Builder

Lesezeit: 6 Minuten

Benutzeravatar von Saeed Vaziry
Said Vaziry

Wie bekomme ich mysql Abfrage von a laravel Anfrage

Konvertieren:

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

Zu:

SELECT * FROM users WHERE `balance`>0 and ...

  • meine Antwort Parameter ersetzen ? mit verbindlichen Werten

    – Honarkha

    11. Oktober 2017 um 6:11 Uhr

  • @honarkhah danke für die Antwort … mein Problem wurde mit der Antwort von RAUSHAN KUMAR gelöst

    – Saeed Vaziry

    12. Oktober 2017 um 13:09 Uhr


  • Was ist Ihr Zweck für die Abfrage?

    – Hirendrasinh S. Rathod

    16. Oktober 2017 um 10:32 Uhr

  • @HirendrasinhS.Rathod Ich habe dies verwendet, um meine Abfrage auf meinem node.js-Server auszuführen

    – Saeed Vaziry

    16. Oktober 2017 um 10:45 Uhr

  • Um es auf dem node.js-Server auszuführen, verwenden Sie die hier erwähnte Lösung laravel-tricks.com/tricks/display-all-sql-executed-in-eloquent Andernfalls habe ich eine verrückte Idee, um die Abfrage auf der Webseite anzuzeigen, aber das hilft Ihnen möglicherweise nicht.

    – Hirendrasinh S. Rathod

    16. Oktober 2017 um 11:01 Uhr

Benutzeravatar von RAUSHAN KUMAR
RAUSHAN KUMAR

verwenden toSql() Methode von Laravel, um die Abfrage wie 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 werden. Verwenden Sie dies, um die Bindungsparameter abzurufen

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

Aktivieren Sie das Abfrageprotokoll als DB::enableQueryLog() und dann die zuletzt ausgeführten Abfragen auf dem Bildschirm ausgeben, können Sie dies verwenden,

dd(DB::getQueryLog());

  • Diese Methode ersetzt Parameter durch ? markieren. select * from `users` where `balance` > ?

    – Saeed Vaziry

    12. Juni 2017 um 11:15 Uhr


  • @ 543310 ja, denn das gibt eine Rohabfrage für dynamische Daten ? so können Sie Ihren eigenen Wert anstelle von angeben ? und direkt ausführen

    – RAUSHAN KUMAR

    12. Juni 2017 um 11:21 Uhr

  • Gibt es eine Möglichkeit, eine Abfrage mit Parametern zu erhalten?

    – Saeed Vaziry

    12. Juni 2017 um 11:24 Uhr

  • Wenn nicht, wie kann ich dieser Rohabfrage Parameter hinzufügen?

    – Saeed Vaziry

    12. Juni 2017 um 11:27 Uhr

  • Sie können so verwenden $query=App\User::where('balance','>',0)->where(...)->toSql(); print_r( $query->getBindings() ); um die Bindungsparameter zu erhalten

    – RAUSHAN KUMAR

    12. Juni 2017 um 11:28 Uhr

Sie können diese Funktion zu 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 so verwenden:

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

  • Herzlich willkommen .. , ich habe dies erstellt, weil es sehr nützlich ist

    – Honarkha

    10. Oktober 2017 um 8:16 Uhr


  • Beachten Sie, dass ? kann Teil einer Zeichenfolge sein.

    – Paul Spiegel

    10. Oktober 2017 um 19:10 Uhr

  • @paul-spiegel alle ersetzen ? mit Bindungswerten

    – Honarkha

    11. Oktober 2017 um 5:22 Uhr


  • @RAUSHANKUMAR Du hast Bounty gestartet, aber nicht benutzt, warum?

    – Honarkha

    11. Oktober 2017 um 6:09 Uhr

  • @honarkhah Sie müssen zwischen Platzhaltern und unterscheiden ? in einem String wie hier: ->selectRaw("'How are you?' AS message"). Für eine zuverlässige Lösung benötigen Sie (eine Art) einen SQL-Parser.

    – Paul Spiegel

    15. Oktober 2017 um 17:39 Uhr

Methode 1

Um eine einzelne Abfrage zu drucken, verwenden Sie die Methode toSql() von Laravel, damit die Abfrage wie folgt ausgeführt wird

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

Methode 2

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

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

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

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

$queries = DB::getQueryLog();

Weitere Informationen erhalten Sie hier Laravel-Abfrageprotokoll aktivieren

Methode 3

Ein weiterer Ansatz, um alle in Laravel verwendeten Abfragen anzuzeigen, ohne das Abfrageprotokoll zu installieren, ist die Installation LaravelDebugBar von hier Laravel-Debug-Leiste. Es ist ein Paket, mit dem Sie Ihre Anwendung während der Entwicklung schnell und einfach im Auge behalten können.

Benutzeravatar von Mayank Pandeyz
Mayank Pandeyz

Versuchen Sie Folgendes, um die rohe SQL-Abfrage zu drucken:

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

Referenz

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

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 Parametern.

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

  • ja, das gleiche was ich oben erwähnt habe

    – RAUSHAN KUMAR

    13. Oktober 2017 um 5:50 Uhr

Benutzeravatar von Victor L
Viktor L

Es ist so seltsam, dass das Laravel keine Möglichkeit hat, das rohe SQL einfach zu bekommen, es ist jetzt immerhin Version 6 …

Hier ist eine Problemumgehung, die ich selbst verwendet habe, um schnell das rohe SQL mit Parametern zu erhalten, ohne eine Erweiterung zu installieren …

Machen Sie Ihr ursprüngliches SQL einfach absichtlich falsch

Wie Veränderung

DB::table('user')

Zu

DB::table('user1')

wobei die Tabelle “user1” gar nicht existiert!

Führen Sie es dann erneut aus.

Sicher wird es eine Ausnahme geben, die von Laravel gemeldet wird.

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'user1' doesn't exist (SQL: ...)

Und jetzt können Sie sehen, dass die rohe SQL mit Parametern direkt nach der Zeichenfolge „(SQL:“

Ändern Sie den falschen Tabellennamen wieder in den richtigen und los geht’s!

  • ja, das gleiche was ich oben erwähnt habe

    – RAUSHAN KUMAR

    13. Oktober 2017 um 5:50 Uhr

Benutzeravatar von Roshan Perera
Roshan Perera

In Laravel 5.4 (ich habe dies in anderen Versionen nicht überprüft) fügen Sie diese Funktion 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");
            }
        );
    }
}

Danach installieren,
https://github.com/ARCANEDEV/LogViewer
und dann können Sie alle ausgeführten SQL-Abfragen sehen, ohne den Code zu bearbeiten.

1444750cookie-checkGenerieren Sie die rohe MySQL-Abfrage aus Laravel Query Builder

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy