[英]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,每次创建带有$score
新Session
,如何更新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.