php - Doctrine :在其他表中插入时更新列

标签 php mysql symfony doctrine-orm doctrine

我有 2 个实体:具有一对多关系的服务和 session

 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,每次使用 $score 新建 Session 时,如何更新 Service 实体的 $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();

最佳答案

您需要创建一个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
    }
}

关于php - Doctrine :在其他表中插入时更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39454814/

相关文章:

mysql - 为什么MySql报 "Subquery returns more than 1 row"错误?

symfony - memcached、APCu 或 redis 作为 Symfony 和 Doctrine 的缓存

PHP 正则表达式 - 匹配所有内容但不完全匹配一个或多个单词

php - 使用 AJAX 和 PHP 检索数据

mysql - 在 Drupal 中创建(折线图)图表(使用 mysql 数据源)时要考虑的任何 forena 替代方案?

php - 数据库没有更新,但没有出现错误。 MySQL 和 PHP

php - 在 Symfony2 中访问 HTML 表单数据

php - Symfony2 : trouble including images in css

php - 使用具有多个标题的 php 邮件功能在发送电子邮件后显示/r/n

php - 通过 jQuery 发送 PHP 变量到登陆页面,同时跳过第三方提交脚本?