2016-06-28 17 views
0

Ich bin Codierung eine Abfrage:Laravel Escape-Zeichen in Query Builder

$result = \DB::table('order_items as oi') 
     ->selectRaw(
      'order_item_type as item_type, 
      order_item_id as item_id, 
      if(order_item_type = "App\\\Models\\\Book", oi.price, invoices.price) as price 
      ) 

nur beachten zu if Aussage, ich habe zwei Escape-Zeichen oder Abfrage doesnt Spiel App\Models\Book zu verwenden. wenn ich Ausgabeabfrage durch Laravel Debugger prüfe sein:

was passiert hier? entfernt laravel query builder einen Schrägstrich und entfernt mysql engine den zweiten Schrägstrich zur Laufzeit?

EDIT:
Aber woanders in der gleichen Abfrage habe ich eine where-Klausel, die i ein Escape-Zeichen verwendet, und es funktioniert gut:

->leftjoin('books', function ($q) { 
      $q->on('q3.order_item_id', '=', 'books.id') 
       ->where('q3.order_item_type', '=', 'App\\Models\\Book'); 
     }) 

und der Ausgangsabfrageteil durch Laravel Debugger:

left join `books` on `q3`.`order_item_id` = `books`.`id` and 
`q3`.`order_item_type` = 'App\Models\Book' 

Kann mir jemand erklären, warum if in i zwei Flucht c verwenden müssen haracter aber in join nur ein Escape-Zeichen benötigt?
in der Tat wäre es kein Problem sein, wenn ich jede Escape-Zeichen in where Query Builder Methode und schreiben verwenden nicht einmal den Code wie:

->leftjoin('books', function ($q) { 
      $q->on('q3.order_item_id', '=', 'books.id') 
       ->where('q3.order_item_type', '=', 'App\Models\Book'); 
     }) 
+0

Haben Sie versucht, entweder 4 oder 2 Backslashes zu verwenden? 3 Backslashes sehen für mich falsch aus. –

+0

@IvanYarych Dieses Verhalten ist nicht immer gleich, werfen Sie einen Blick auf EDIT. – alex

Antwort

1

Beide PHP und MySQL 12 Schrägstriche entkommt. MySQL dagegen benötigt sie, es sei denn, NO_BACKSLASH_ESCAPES3 SQL-Modus ist aktiviert - es ist standardmäßig deaktiviert. In MySQL wird die Escape-Sequenz entweder interpretiert oder ignoriert - \n wird in eine neue Zeile übersetzt, \m wird ignoriert und in m übersetzt.

Also zuerst wird PHP \\\ in \\ konvertieren - zwei erhalten in einer entflohen. Dann wird MySQL auch \\ in \ entkommen, verstehen, dass Sie einen literalen Schrägstrich wollten. :)

In Bezug auf Ihre Bearbeitung sendet selectRaw() rohe Abfragen an MySQL, so dass Sie die Daten selbst entkommen müssen. Alle anderen nicht-rohen Methoden tun dies intern in Laravel Query Builder, so dass Sie sich nicht mit diesen Dingen beschäftigen müssen.

PHP, im Gegensatz zu MySQL, ignoriert Schrägstriche nicht. Bei Verwendung von Strings in Anführungszeichen wird jeder nicht endende Schrägstrich trotzdem als literal erkannt, so dass Sie nicht entfliehen müssen - wenn Ihre Zeichenfolge mit einem Schrägstrich endet, sind Sie erforderlich. Bei doppelt zitierten Strings gibt es Escape-Sequenzen, die übersetzt werden - Ihr Beispiel würde immer noch mit ihnen funktionieren, aber es gibt Fälle, die schiefgehen können.

+0

danke, ich habe eine Bearbeitung hinzugefügt. Bitte überprüfen Sie die Frage erneut – alex

+0

Ich aktualisierte meine Antwort, um auch Ihre neue Frage zu beantworten. ;) –

+0

Ich habe kein Escape-Zeichen in der internen 'where' Abfrage-Builder-Methode verwendet, und es funktioniert einwandfrei. Bedeutet es, dass "Where" -Methode alle geschriebenen Zeichen des Benutzers (Entwicklers) als Literal annehmen wird? – alex

Verwandte Themen