带连接的Doctrine批量DQL更新

时间:2016-05-06 19:32:39

标签: php mysql symfony doctrine-orm

我需要使用一组值更新大量实体(~100k)。为此,我想使用DQL update Query

问题来自我的查询的where子句。我需要过滤要更新的实体。

$qb->update('MyBundle/Entity/MyEntity', 'e')
->set('e.fieldToUpdate', ':value')
->innerJoin('e.relation', 'r')
->where('r.filter < :filter')
->setParameters...

更新和删除查询不支持不幸的联接。 自从MySQL文档说明以来,我无法在e.id IN "subquery"中使用where子句:

  

在MySQL中,您无法修改表并从子查询中的同一个表中进行选择。

我希望避免因性能原因而使用基于循环的Query#iterate()工具或其他解决方案,因此......我不知道如何处理此问题。

这听起来像是一个常见的问题,我可能会错过一些非常明显的事情......所以,如果有一个解决方法可以做到这一点,我会很高兴看到它!

1 个答案:

答案 0 :(得分:2)

感谢Miro,我找到了一个非常明显的解决方案(当然)......

由于我无法在子查询中选择我正在更新的同一个表,我不得不从另一个表中选择关系。

Doctrine不允许选择 $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 ]); 之类的内容,其中'mytable`是我定位的实体,但是,有一个DQL函数可以执行此操作:IDENTITY

例如:

Insert -> Sub-report