17 Stimmen

Unterschied zwischen den Roh-SQL-Funktionen von Laravel

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?

30voto

Antonio Carlos Ribeiro Punkte 84627

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;'));

3voto

Adem Tepe Punkte 474

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:

Laravel-Dokumentation warnt vor der Verwendung von Rohzeichenfolgen in Datenbankabfragen

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)

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