2016-04-08 2 views
0

Wie erstelle ich diese SQL-Anweisung mit CakePHP 3;CakePHP 3 DeleteAll, wo die ersten 4 Buchstaben nicht http sind

delete FROM bookmarks WHERE substring(url , 4) != 'http' 

Ive versucht;

$this->Bookmark->deleteAll('substring(Bookmark.url,4) !=' => 'http',false); 

CakePHP mag nicht der Substring oder LEFT() Funktion

+0

"_doesn't like_" ist keine richtige Problembeschreibung! Obwohl es vielleicht beantwortbar ist, bitte seien Sie immer so genau wie möglich, was _exaktly_ passiert und was Sie stattdessen erwarten würden. – ndm

+0

Auch wahrscheinlich ein Duplikat von ** http: //stackoverflow.com/questions/30845997/how-to-generate-sql-function-calls-with-the-cakephp-query-builder**. – ndm

Antwort

0

Wie wäre es damit:

$this->Bookmark->deleteAll([ 
    'NOT' => ['SUBSTRING(url, 1, 4)' => 'http'], 
]); 
+0

Dies erzeugt ungültiges SQL, da in DELETE-Abfragen der Konditionsschlüssel einem Alias-Stripping unterliegt, was im Grunde funktioniert wie "_give mir alles nach dem möglichen dot_", so dass du mit etwas wie 'WHERE NOT (url, 4) = 'http') '. Es funktioniert ohne Alias, aber die Verwendung eines Ausdrucks, der Auto-Quoting und Dialekt-Transformation unterstützt, könnte die bessere/leichtere Wahl sein (ja, ich weiß, 'SUBSTRING' ist noch nicht transformierbar). Nebenbei bemerkt, es muss "1, 4", nicht nur "4" sein. – ndm

+0

ja es machte eine schlechte Abfrage nicht sicher, wie es zu beheben ist. Es scheint SQL-Funktion Teilstring zu ignorieren. Ausgabe; LÖSCHEN VON Lesezeichen WHERE NICHT (url, 4) = 'http' –