855 Stimmen

Wie kann ich den Abfrage-Generator dazu bringen, seine Roh-SQL-Abfrage als Zeichenfolge auszugeben?

Unter Verwendung des folgenden Codes:

DB::table('users')->get();

Möchte ich den Roh-SQL-Abfragestring erhalten, den der obige Datenbankabfrage-Generator erstellen wird. In diesem Beispiel wäre es SELECT * FROM users.

Wie mache ich das?

45voto

jisna Punkte 1925

Es gibt eine Methode in Eloquent, um die Abfragezeichenfolge zu erhalten.

toSql()

In unserem Fall,

 DB::table('users')->toSql(); 

gibt zurück

select * from users

ist die genaue Lösung, die die SQL-Abfragezeichenfolge zurückgibt. Hoffentlich ist das hilfreich...

33voto

Kuldeep Mishra Punkte 3395
$data = User::toSql();
echo $data; //Dies gibt select * from users zurück. //hier ist User das Modell

32voto

justnajm Punkte 3989

Dies ist die beste Lösung, die ich jedem vorschlagen kann, um das letzte Abfrageergebnis von Eloquent oder die endgültige Abfrage zu debuggen, obwohl dies ebenfalls diskutiert wurde:

// Abfrage-Builder
$query = DB::table('table_name')->where('id', 1);

// Ersetzung von Bindungen
$sql = str_replace_array('?', $query->getBindings(), $query->toSql());

// für Laravel 5.8^
$sql = Str::replaceArray('?', $query->getBindings(), $query->toSql());

// ausgeben
dd($sql);

26voto

Yevgeniy Afanasyev Punkte 32229

Wenn Sie Laravel 5.1 und MySQL verwenden, können Sie diese von mir erstellte Funktion verwenden:

/*
 * gibt SQL mit Werten darin zurück
 */
function getSql($model)
{
    $replace = function ($sql, $bindings)
    {
        $needle = '?';
        foreach ($bindings as $replace){
            $pos = strpos($sql, $needle);
            if ($pos !== false) {
                if (gettype($replace) === "string") {
                     $replace = ' "'.addslashes($replace).'" ';
                }
                $sql = substr_replace($sql, $replace, $pos, strlen($needle));
            }
        }
        return $sql;
    };
    $sql = $replace($model->toSql(), $model->getBindings());

    return $sql;
}

Als Eingabeparameter können Sie eine der folgenden verwenden

Illuminate\Database\Eloquent\Builder

Illuminate\Database\Eloquent\Relations\HasMany

Illuminate\Database\Query\Builder

23voto

Ravi Mane Punkte 1388

Zuerst müssen Sie das Query-Protokoll aktivieren, indem Sie den folgenden Befehl aufrufen:

DB::enableQueryLog();

Nachdem Sie Abfragen mit der DB-Fassade verwendet haben, können Sie folgendes eingeben:

dd(DB::getQueryLog());

Die Ausgabe wird wie folgt aussehen:

array:1 [
  0 => array:3 [
    "query" => "select * from `users` left join `website_user` on `users`.`id` = `website_user`.`user_id` left join `region_user` on `users`.`id` = `region_user`.`user_id` left "
    "bindings" => array:5 []
    "time" => 3.79
  ]
]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X