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?

18voto

Ijas Ameenudeen Punkte 8699

Ein 'makrobares' Ersatzobjekt, um die SQL-Abfrage mit den Bindungen zu erhalten.

  1. Fügen Sie die unten stehende Makrofunktion in der Methode boot() von AppServiceProvider hinzu.

    \Illuminate\Database\Query\Builder::macro('toRawSql', function(){
        return array_reduce($this->getBindings(), function($sql, $binding){
            return preg_replace('/\?/', is_numeric($binding) ? $binding : "'".$binding."'" , $sql, 1);
        }, $this->toSql());
    });
  2. Fügen Sie einen Alias für den Eloquent Builder hinzu. (Laravel 5.4+)

    \Illuminate\Database\Eloquent\Builder::macro('toRawSql', function(){
        return ($this->getQuery()->toRawSql());
    });
  3. Dann debuggen Sie wie gewohnt. (Laravel 5.4+)

    Zum Beispiel Query Builder

    \Log::debug(\DB::table('users')->limit(1)->toRawSql())

    Zum Beispiel Eloquent Builder

    \Log::debug(\App\User::limit(1)->toRawSql());

Hinweis: In Laravel 5.1 bis 5.3, da der Eloquent Builder das Macroable-Trait nicht nutzt, kann kein Alias toRawSql dem Eloquent Builder dynamisch hinzugefügt werden. Befolgen Sie das folgende Beispiel, um dasselbe zu erreichen.

Zum Beispiel Eloquent Builder (Laravel 5.1 - 5.3)

\Log::debug(\App\User::limit(1)->getQuery()->toRawSql());

17voto

SaidbakR Punkte 12544

Der einfachste Weg ist, einen absichtlichen Fehler zu machen. Zum Beispiel möchte ich die vollständige SQL-Abfrage der folgenden Beziehung sehen:

public function jobs()
{
    return $this->belongsToMany(Job::class, 'eqtype_jobs')
        ->withPivot(['created_at','updated_at','id'])
        ->orderBy('pivot_created_at','desc');
}

Ich möchte einfach eine Spalte nicht gefunden machen, hier wähle ich created_at und ändere es zu created_ats, indem ich ein nachgestelltes s hinzufüge:

public function jobs()
{
    return $this->belongsToMany(Job::class, 'eqtype_jobs')
        ->withPivot(['created_ats','updated_at','id'])
        ->orderBy('pivot_created_at','desc');
}

Der Debugger wird also den folgenden Fehler zurückgeben:

(4/4) ErrorException SQLSTATE[42S22]: Spalte nicht gefunden: 1054 Unbekannte Spalte 'eqtype_jobs.created_ats' in 'Feldliste' (SQL: select jobs.*, eqtype_jobs.set_id as pivot_set_id, eqtype_jobs.job_id as pivot_job_id, eqtype_jobs.created_ats as pivot_created_ats, eqtype_jobs.updated_at as pivot_updated_at, eqtype_jobs.id as pivot_id from jobs inner join eqtype_jobs on jobs.id = eqtype_jobs.job_id where eqtype_jobs.set_id = 56 order by pivot_created_at desc limit 20 offset 0) (View: /home/said/www/factory/resources/views/set/show.blade.php)

Die obige Fehlermeldung gibt die vollständige SQL-Abfrage mit dem Fehler zurück

SQL: select  jobs.*, eqtype_jobs.set_id as pivot_set_id,  eqtype_jobs.job_id as pivot_job_id, eqtype_jobs.created_ats as pivot_created_ats, eqtype_jobs.updated_at as  pivot_updated_at, eqtype_jobs.id as pivot_id from jobs inner join eqtype_jobs on jobs.id = eqtype_jobs.job_id where  eqtype_jobs.set_id = 56 order by pivot_created_at desc limit 20 offset 0

Entfernen Sie jetzt einfach das zusätzliche s von created_at und testen Sie dieses SQL wie gewünscht in einem beliebigen SQL-Editor wie z.B. dem phpMyAdmin SQL-Editor!

Hinweis: Die Lösung wurde mit Laravel 5.4 getestet.

16voto

Greg Punkte 306033

Ab Laravel 5.8.15 hat der Abfrage-Generator jetzt die Methoden dd und dump, sodass Sie Folgendes tun können

DB::table('data')->where('a', 1)->dump();

16voto

Sagar Naliyapara Punkte 3715

Erster Weg:

Einfach können Sie die folgenden Dinge mit der Methode toSql() tun,

$query = DB::table('users')->get();

echo $query->toSql();

Wenn es nicht funktioniert, können Sie die Dinge gemäß der Laravel-Dokumentation einrichten.

Zweiter Weg:

Ein anderer Weg, um es zu tun, ist

DB::getQueryLog()

aber wenn es ein leeres Array zurückgibt, dann ist es standardmäßig deaktiviert besuchen Sie dies,

aktivieren Sie es einfach mit DB::enableQueryLog() und es wird funktionieren :)

für weitere Informationen besuchen Sie das Github Issue, um mehr darüber zu erfahren.

Hoffentlich hilft es :)

13voto

rahim.nagori Punkte 587

Nach meiner Meinung wird dies als Anfänger der beste Ansatz sein:

echo "

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