2017-07-28 8 views
0

愚かな質問ですが、私は答えを見つけることができません。Doctrineで合計リレーションカウンターを更新する

は、私はこのようなクエリを実行する必要があります。

$em 
    ->createQueryBuilder() 
    ->update('AppBundle:Contest\Member', 'm') 
    ->innerJoin('m.votes', 'v') 
    ->set('m.total_votes', 'COUNT(v.id)') 
    ->where('m.id = :member') 
    ->setParameter('member', $member->id()) 
    ->getQuery() 
    ->execute() 
; 

または

UPDATE 
    AppBundle:Contest\Member AS m 
INNER JOIN 
    m.votes v 
SET 
    m.total_votes = COUNT(v.id) 
WHERE 
    m.id = :member 
DQLを通じてDoctrineは断固ステートメクエリに拒否します。

私は間違っていますか?

答えて

0

は、私は解決策

$total = $em 
    ->getRepository('AppBundle:Contest\Member\Vote') 
    ->createQueryBuilder('v') 
    ->select('COUNT(v.id)') 
    ->where('v.member = :member') 
    ->setParameter('member', $member->getId()) 
    ->getDQL() 
; 

$em->createQueryBuilder() 
    ->update('AppBundle:Contest\Member', 'm') 
    ->set('m.total_votes', '('.$total.')') 
    ->where('m.id = :member') 
    ->setParameter('member', $member->getId()) 
    ->getQuery() 
    ->execute() 
; 
を見つけました
関連する問題