Doctrine:在其他表

时间:2016-09-12 16:28:07

标签: php mysql symfony doctrine-orm doctrine

我有两个实体:服务和具有一对多关系的会话

 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;
 }

使用Doctrine QueryBuilder,每当创建$avgScore ServiceSession时,如何更新$score实体的 $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();

这就是我试图做的事情:

webpack.config.js

1 个答案:

答案 0 :(得分: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
    }
}