我已在网上测试并完成了一些研究,但仍然没有运气。有没有人遇到过这个问题?
说,我有一个学说查询设置如下:
$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));
而不是给我:
UPDATE pck_folder SET id_path = CONCAT(?, RIGHT(id_path, LENGTH(id_path)-?)) WHERE (id_path like '1/2//%')
学说给了我:
UPDATE pck_folder SET id_path = CONCAT(?, RIGHT(id_path, LENGTH(id_path-?))) WHERE (id_path like '1/2//%')
请注意此部分RIGHT(id_path, LENGTH(id_path)-?)
答案 0 :(得分:1)
(注意:我假设您使用的是Doctrine 1.2。我还没有使用过Doctrine 2.0。)
之前我没有遇到过那个特定的bug,但是我发现Doctrine_Query中update()的实现存在很多问题。除了最直接的更新查询之外,基本上任何东西都会导致解析器生成错误或无效的查询。例如,它无法处理更新中的子选择。
尝试编写Raw SQL查询,或者使用效率较低但功能齐全的解决方法:使用Doctrine_Query选择要更新的记录,然后迭代它们并在PHP中设置字段,然后在每个上调用save()之一。
顺便说一下,使用UPDATE查询和Doctrine固有的GOTCHA很大程度上强迫您在许多情况下使用该解决方法。也就是说,如果您或您的插件在模型中使用了漂亮的Doctrine钩子方法,但是您执行了影响这些记录的SQL级别更新,那么钩子将被静默地绕过。根据您的应用程序,这可能会破坏您的业务逻辑处理。