Doctrine Query Builder not working with UPDATE and INNER JOIN

后端 未结 4 1369
没有蜡笔的小新
没有蜡笔的小新 2020-12-19 03:40

In my repository I have this query:

$qb = $this->getEntityManager()->createQueryBuilder();
$qb
    ->update(\'MyBundle:Entity1\', \'e1\') 
    ->         


        
4条回答
  •  轮回少年
    2020-12-19 04:06

    Very old question, but do not contain an answer in full query builder.

    So yes, the following query is not possible to sync fields of two tables:

    $this->createQueryBuilder('v')
        ->update()
        ->join(Pegass::class, 'p', Join::WITH, 'v.identifier = p.identifier')
        ->set('v.enabled', 'p.enabled')
        ->where('p.type = :type')
        ->setParameter('type', Pegass::TYPE_VOLUNTEER)
        ->andWhere('v.enabled <> p.enabled');
    

    The generated query do not contain the relation because of its lack of support in all dbms as explained above. They also tell you to use subqueries instead.

    So that's how I did the equivalent (even if using 2 queries and is less performant...):

    foreach ([false, true] as $enabled) {
        $qb = $this->createQueryBuilder('v');
    
        $sub = $this->_em->createQueryBuilder()
            ->select('p.identifier')
            ->from(Pegass::class, 'p')
            ->where('p.type = :type')
            ->andWhere('p.enabled = :enabled');
    
        $qb
            ->setParameter('type', Pegass::TYPE_VOLUNTEER)
            ->setParameter('enabled', $enabled);
    
        $qb
            ->update()
            ->set('v.enabled', $enabled)
            ->where($qb->expr()->in('v.identifier', $sub->getDQL()))
            ->getQuery()
            ->execute();
    }
    

提交回复
热议问题