Es scheint, dass ich nicht die einzige Person bin, die mit den Unterschieden zwischen den Laravel-Methoden DB::raw(), DB::select(), DB::statement() und DB::unprepared() zu kämpfen hat. Es scheint, als müsste man fast einen gegebenen SQL-Befehl mit allen 4 Methoden ausprobieren, um herauszufinden, welche funktioniert. Kann jemand erklären, wie sie zueinander stehen und welche für welche Zwecke verwendet werden sollen?
Antworten
Zu viele Anzeigen?Ich werde versuchen zu klären:
DB::raw()
Es generiert einen rohen und bereinigten SQL-String, der an andere Abfragen/Statements übergeben werden soll, um SQL-Injections zu verhindern. Es soll mit allem und niemals alleine verwendet werden. Und du solltest niemals einen nicht bereinigten String an deine Abfragen/Statements senden.
DB::select(DB::raw('select * from whatever'));
DB::select()
Ist für einfache SELECT-Abfragen:
DB::select(DB::raw('select * from whatever'));
DB::statement()
Ich denke, es funktioniert mit SELECT-Abfragen, sollte aber für Nicht-SQL-Abfrage-Befehle verwendet werden:
DB::statement(DB::raw('update whatever set valid = true;'));
DB::unprepared()
Alle SQL-Befehle in Laravel sind standardmäßig vorbereitet, aber manchmal muss ein Befehl im unvorbereiteten Modus ausgeführt werden, da einige Befehle in einigen Datenbanken nicht im vorbereiteten Modus ausgeführt werden können. Hier ist ein Problem, das ich dazu eröffnet habe: https://github.com/laravel/framework/issues/53
DB::unprepared(DB::raw('update whatever set valid = true;'));
Weitere korrekte Antwort (Meiner Meinung nach) für Laravel >= 5.0
DB::raw()
Erzeugt "raw", was "nicht bereinigt" bedeutet. Deshalb gibt es in der Laravel-Dokumentation eine Warnung:
DB::select() , DB::insert() , DB::update() , DB::delete()
Dies sind die praktischen Methoden, die Laravel anbietet und die vorbereitete Anweisungen ausführen.
DB::statement()
Dies dient wiederum dazu, vorbereitete Anweisungen auszuführen, die nicht spezifisch für CRUD sind.
Die Methoden, die vorbereitete Anweisungen verwenden bieten Schutz vor SQL-Injection, während diese Verantwortung beim Verwenden von Rohzeichenfolgen beim Programmierer liegt.
DB::unprepared()
Dazu gibt es keine Informationen in den Laravel-Dokumenten und nur wenige Informationen im Internet. Nichtsdestotrotz habe ich es getestet, basierend auf der obigen Antwort und diesem Beispiel:
Laravel, erstelle MySQL Trigger aus Migration
Ich habe zum Beispiel versucht, zunächst einen MySQL-Trigger mit der Methode DB::statement() zu erstellen, aber es hat mir diesen Fehler bei der Migration gegeben:
Exception trace:
1 PDOException::("SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if
your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.")
C:\wamp64\www\oscared-laravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458
2 PDOStatement::execute()
C:\wamp64\www\oscared-laravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458
Als ich es jedoch mit DB::unprepared() getestet habe, hat es reibungslos funktioniert. (Laravel 5.8)