TiP*_*iPi 1 php mysql symfony doctrine-orm
我需要用几组值更新大量实体(~100k)。为此,我想使用DQL 更新查询。
问题来自我的查询的 where 子句。我需要过滤要更新的实体。
$qb->update('MyBundle/Entity/MyEntity', 'e')
->set('e.fieldToUpdate', ':value')
->innerJoin('e.relation', 'r')
->where('r.filter < :filter')
->setParameters...
Run Code Online (Sandbox Code Playgroud)
不幸的是,更新和删除查询不支持连接。而且我将无法使用 where 子句,e.id IN "subquery"因为 MySQL 文档说:
在 MySQL 中,您不能修改表并在子查询中从同一个表中进行选择。
出于性能原因,我想避免使用Query#iterate()基于循环的设施或其他解决方案,所以......我不知道如何处理这个问题。
这听起来像是一个常见问题,我可能会错过一些非常明显的东西......所以如果有解决方法可以做到这一点,我会很高兴阅读它!
感谢米罗,我找到了一个非常明显的解决方案(当然)......
由于我无法在子查询内选择我正在更新的同一个表,因此我必须从另一个表中选择关系。
Doctrine 不允许选择诸如r.mytable“mytable”是我的目标实体之类的内容,但是,有一个 DQL 函数可以执行此操作:IDENTITY
例如 :
$dql = $queryBuilder
->from('Relation', 'r')
->select('IDENTITY(r.myEntity)')
->where('r.filter > :filter')
->getDQL()
;
$queryBuilder = $this
->createQueryBuilder('e')
->update('MyBundle/Entity/MyEntity', 'e')
->set('e.fieldToUpdate', ':value')
->where(
$queryBuilder->expr()->In('e.id', $dql)
)
->setParameters([
'filter' => $filter
]);
Run Code Online (Sandbox Code Playgroud)