2016-09-12 1 views
0

私は2つの実体があります。サービスとDoctrine QueryBuilderと1対多の関係ドクトリン:他の表の挿入時に更新列

class Service{ 
    /** 
     * @var int 
     * 
     * @ORM\Column(name="avg_score", type="integer") 
     */ 
    private $avgScore; 

    /** 
     * @ORM\OneToMany(targetEntity="Session", mappedBy="service") 
     */ 
     private $sessionList; 
} 

class Session{ 
     /** 
     * @ORM\ManyToOne(targetEntity="Service", inversedBy="sessionList") 
     * @ORM\JoinColumn(name="service_id", referencedColumnName="id") 
     */ 
     private $service; 

     /** 
     * @var int 
     * 
     * @ORM\Column(name="score", type="integer", nullable=true) 
     */ 
     private $score; 
} 

とのセッションどのように私は$scoreで新しいSessionServiceエンティティ毎回の$avgScoreを更新することができますが創造された?

これは私が何をしようとしたものです:

$qb = $this->getDoctrine()->getEntityManager()->createQueryBuilder(); 
    $q = $qb->update('AppBundle:Service', 's') 
     ->join('AppBundle:Session', 'ss') 
     ->addSelect('avg(ss.score) as score_avg') 
     ->groupBy('ss.service') 
     ->set('s.avgScore', 'score_avg') 
     ->where('s.id = ?1') 
     ->setParameter(1, $service->getId()) 
     ->getQuery(); 
    $q->execute(); 

答えて

1

あなたはDoctrine Events Listener

services: 
    my.listener: 
     class: AppBundle\EventListener\AvgScoreUpdater 
     tags: 
      - { name: doctrine.event_listener, event: prePersist } 

を作成し、AvgScoreUpdaterのロジックを実装する必要があります。

class AvgScoreUpdater 
{ 
    public function prePersist(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 

     if (!($entity instanceof Session) || !$entity->getScore()) { 
      return; 
     } 

     $entityManager = $args->getEntityManager(); 

     $service = $entity->getService(); 
     // Then realize logic to update avg_score on a service 
    } 
} 
関連する問題