带有连接的Doctrine查询构建器更新

时间:2017-09-04 09:51:38

标签: doctrine-orm

我必须使用多对多关联字段(groupes)上的条件更新某些实体(StatistiqueColle)。

以下是我所做的查询,目前无效:

$qb = $this->em->createQueryBuilder();
    $qb->update('PACESStatistiqueBundle:StatistiqueColle', 's')
        ->set('s.banque', 1)
        ->set('s.statsEntrainement', 0)
        ->andWhere($qb->expr()->in('s.groupes', 'g'))
        ->andWhere($qb->expr()->eq('s.banque', ':banque'))
        ->andWhere($qb->expr()->in('g.id', ':salle'))
        ->andWhere($qb->expr()->eq($qb->expr()->count('g.id'), ':count'))
        ->setParameters(['salle' => $groupeSalle, 'banque' => 0, 'count' => 1]);
    $qb->getQuery()->execute();

我看到Doctrine并不接受加入更新。如果没有加入,我怎么能做我想做的事?

1 个答案:

答案 0 :(得分:0)

更新和删除查询不支持联接,因为并非所有dbms都支持联接。它不会在Doctrine 1或Doctrine 2中实现。但是,您可以通过使用子查询获得相同的效果。

http://www.doctrine-project.org/jira/browse/DC-646

另一个解决方案是将其拆分为两个查询:

  • 选择要更新的所有记录
  • 更新记录

喜欢这样的东西:

$qb = $this->em->createQueryBuilder();
$results = $qb->select('PACESStatistiqueBundle:StatistiqueColle', 's')
    ->andWhere($qb->expr()->in('s.groupes', 'g'))
    ->andWhere($qb->expr()->eq('s.banque', ':banque'))
    ->andWhere($qb->expr()->in('g.id', ':salle'))
    ->andWhere($qb->expr()->eq($qb->expr()->count('g.id'), ':count'))
    ->setParameters(['salle' => $groupeSalle, 'banque' => 0, 'count' => 1]);
$qb->getQuery()->getResult();

foreach ($results ad $result) {
    $result->setBanque(1);
    $result->setStatsEntrainement(1);
    $this->em->persist($result);
    $this->em->flush();
}