2012-04-10 10 views
0

Ich habe online einiges Recherche und getan, aber immer noch kein Glück. Ist jemals jemand auf dieses Problem gestoßen?Lehre - seltsame verschobene Klammer in der Abfrage

Sprich: Ich habe eine Lehre Abfrage aufgebaut wie:

$q = Doctrine_Query::create() 
->update('PckFolder') 
->set('id_path', "CONCAT(?, RIGHT(id_path, LENGTH(id_path)-?))", array($newPath, $lenOld)) 
->where("id_path like '$oldPath%'"); 

// and I print the query out 
$qstr = $q->getSqlQuery(array($newPath, $lenOld)); 

Statt mir zu geben:

UPDATE pck_folder SET id_path = CONCAT(?, RIGHT(id_path, LENGTH(id_path)-?)) WHERE (id_path like '1/2//%') 

Lehre gab mir:

UPDATE pck_folder SET id_path = CONCAT(?, RIGHT(id_path, LENGTH(id_path-?))) WHERE (id_path like '1/2//%') 

bitte diesen Teil beachten RIGHT(id_path, LENGTH(id_path)-?)

Antwort

1

(Hinweis: Ich gehe davon aus, dass Sie Doctrine 1.2 verwenden. Ich habe Doctrine 2.0 noch nicht benutzt.)

Ich hatte diesen spezifischen Fehler vorher nicht, aber ich habe zahlreiche Probleme mit der Implementierung von update() in Doctrine_Query gefunden. Im Grunde alles andere als die sehr einfachen Aktualisierungsabfragen wird dazu führen, dass der Parser falsche oder ungültige Abfragen generiert. Zum Beispiel kann es Unterauswahlen innerhalb einer Aktualisierung nicht behandeln.

Versuchen Sie, eine Raw-SQL-Abfrage zu schreiben, oder verwenden Sie eine weniger effiziente, aber voll funktionsfähige Problemumgehung: Wählen Sie die zu aktualisierenden Datensätze mit Doctrine_Query aus, durchlaufen Sie sie, legen Sie das Feld in PHP fest und rufen Sie dann save() auf Jeder.

Übrigens, es gibt ein großes GOTCHA inhärent mit der Verwendung von UPDATE-Abfragen und Doctrine, die Sie in vielen Fällen ohnehin dazu zwingen, diese Problemumgehung zu verwenden. Das heißt, wenn Sie oder Ihre Plugins die raffinierten Doctrine-Hook-Methoden in Ihren Modellen verwendet haben, aber Sie eine SQL-Level-Aktualisierung ausführen, die sich auf diese Datensätze auswirkt, werden die Hooks stillschweigend umgangen. Abhängig von Ihrer Anwendung kann dies Ihre Geschäftslogikverarbeitung ruinieren.

+0

gut, danke ... –