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?
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?
Ein 'makrobares' Ersatzobjekt, um die SQL-Abfrage mit den Bindungen zu erhalten.
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());
});
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());
});
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 AliastoRawSql
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());
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
aspivot_set_id
,eqtype_jobs
.job_id
aspivot_job_id
,eqtype_jobs
.created_ats
aspivot_created_ats
,eqtype_jobs
.updated_at
aspivot_updated_at
,eqtype_jobs
.id
aspivot_id
fromjobs
inner joineqtype_jobs
onjobs
.id
=eqtype_jobs
.job_id
whereeqtype_jobs
.set_id
= 56 order bypivot_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.
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.
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 :)
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.