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?

7voto

Jasim Juwel Punkte 566

Laravel ausgeführte Abfrage anzeigen mit Laravel Query-Log

DB::enableQueryLog();

$abfragen = DB::getQueryLog();

7voto

Mark Baaijens Punkte 428

Um alle ausgeführten Abfragen zu protokollieren, können Sie DB::enableQueryLog() in Verbindung mit DB::getQueryLog() verwenden. Die Ausgabe hat die folgende Struktur.

[
  [
    "query" => "select * from "users" where name = ?"
    "bindings" => ["John Doe"]
    "time" => 0.34
  ],
  ...
]

Zusätzlich habe ich hier einige Antworten kombiniert, um die perfekte Funktion zum Parsen des SQL mit den kompilierten Bindungen zu erhalten. Siehe unten. Ich habe sogar eine benutzerdefinierte Builder-Klasse erstellt, die diese Funktionalität implementiert, um z. B. User::where('name','John Doe')->parse();

function parse_sql(string $sql, array $bindings) : string
{
  $compiled_bindings  = array_map('compile_binding', $bindings);

  return preg_replace_array("/\?/", $compiled_bindings, $sql);
}

function compile_binding($binding)
{
  $grammar = new MySqlGrammar;

  if (is_bool($binding))
  {
    return (int)$binding; //Diese Zeile hängt von der Datenbank-Implementierung ab
  }

  if(is_string($binding))
  {
    return "'$binding'";
  }

  if ($binding instanceof DateTimeInterface)
  {
    return $binding->format($grammar->getDateFormat());
  }

  return $binding;
}

7voto

MTakumi Punkte 330

Sie können die toSql-Methode verwenden - der einfachste Weg

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

Und auch wenn Sie Bindungen in Ihrer Abfrage haben und die Abfrage mit Bindungen sehen möchten. Sie können etwas Ähnliches verwenden:

$query = DB::table('table')->whereIn('some_field', [1,2,30]); 

$sql_with_bindings = str_replace_array('?', $query->getBindings(), $query->toSql());

dd($sql_with_bindings);

6voto

BoogieBug Punkte 390

Dies ist die Funktion, die ich in meine Basismodellklasse platziert habe. Übergeben Sie einfach das Abfragebuilder-Objekt und der SQL-String wird zurückgegeben.

function getSQL($builder) {
  $sql = $builder->toSql();
  foreach ( $builder->getBindings() as $binding ) {
    $value = is_numeric($binding) ? $binding : "'".$binding."'";
    $sql = preg_replace('/\?/', $value, $sql, 1);
  }
  return $sql;
}

5voto

Nikhil Gyan Punkte 642

Versuchen Sie dies:

$results = DB::table('users')->toSql();
dd($results);

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

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