简体   繁体   English

原则:在其他表中插入时更新列

[英]Doctrine: update column on insert in other table

I have 2 entities: Service and Session with one-to-many relationship 我有2个实体:具有一对多关系的服务和会话

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

With Doctrine QueryBuilder how can I update $avgScore of Service entity everytime new Session with $score is created? 使用Doctrine QueryBuilder,每次创建带有$scoreSession ,如何更新Service实体的$avgScore

This is what I tried to do: 这是我尝试做的:

   $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();

You need to create a Doctrine Events Listener 您需要创建一个Doctrine事件监听器

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

And then in AvgScoreUpdater implement logic: 然后在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
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM