0

我已经在网上进行了测试并进行了一些研究,但仍然没有运气。有没有人遇到过这个问题?

说,我有一个学说查询设置如下:

$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)-?)

4

1 回答 1

1

(注意:我假设您使用的是 Doctrine 1.2。我还没有使用过 Doctrine 2.0。)

我之前没有遇到过这个特定的错误,但我发现在 Doctrine_Query 中实现 update() 存在许多问题。除了最直接的更新查询之外,基本上任何事情都会导致解析器生成错误或无效的查询。例如,它不能处理更新中的子选择。

尝试编写原始 SQL 查询,或者使用效率较低但功能齐全的解决方法:使用 Doctrine_Query 选择要更新的记录,然后遍历它们并在 PHP 中设置字段,然后对每个记录调用 save()。

顺便说一句,使用 UPDATE 查询和 Doctrine 有一个很大的 GOTCHA 固有的问题,这会迫使您在许多情况下使用该解决方法。也就是说,如果您或您的插件在模型中使用了漂亮的 Doctrine 钩子方法,但您执行了影响这些记录的 SQL 级更新,则这些钩子将被静默规避。根据您的应用程序,这可能会破坏您的业务逻辑处理。

于 2012-04-12T15:37:03.460 回答