事件订阅者postUpdate查询未更新

时间:2013-09-03 18:37:43

标签: symfony doctrine-orm symfony-2.3

我正在尝试比较升级前后的数据库数据,以便执行操作。

具体做法是:

协会:艺术家ManyToMany Soundtrack。

当我通过录音音轨删除艺术家时,我会检查该艺术家是否没有关联,如果是,则删除艺术家。

public function postUpdate(LifecycleEventArgs $args)
{
    $entity = $args->getEntity();
    $em = $args->getEntityManager();

    if ($entity instanceof Soundtrack) {
        //$this->difference contains the difference between the artists before and the artists after the change.
        if(!empty($this->difference)) {
            foreach($this->difference as $m) {
                $art = $em->getRepository('AcmeUserBundle:Artist')->findArtistByIdJoinSoundtrack($m);
                var_dump($art->getId());

            }
        }
    }
}

查询findArtistByIdJoinSoundtrack():

public function findArtistByIdJoinSoundtrack($id) {
    $qb = $this->createQueryBuilder('a');
         $query = $qb->select(array('partial a.{id}'))
                 ->innerJoin('a.soundtrack', 's')
                 ->where('a.id = :id')
                 ->setParameter('id', $id)
                 ->setMaxResults(1)
                 ->getQuery();

         return $query->getSingleResult();
}

问题出现在我运行查询以查看艺术家是否没有关联,实际上是在postUpdate中查询:

$em->getRepository('AcmeUserBundle:Artist')->findArtistByIdJoinSoundtrack($m);

例如,如果艺术家与id为71的音轨只有一个关联 我刚从声道中移除了id为71的艺术家,查询不会返回空响​​应,但会返回一个只有71个id的元素音轨。

换句话说,尽管使用了flush()之后调用的事件postUpdate,但好像数据库没有更新。

为什么会这样?

我也多次清除缓存,以确保不是问题所在!

1 个答案:

答案 0 :(得分:2)

请查看my answer here。通常,不允许使用preUpdate侦听器更改相关实体。你的想法......

  

[...]事件postUpdate [...]在flush()之后被调用。

...不完全正确 - 在 flush()之后未调用postUpdate而在之内

  

在EntityManager #flush()中调用三个帖子[postUpdate,postRemove,postPersist]事件。变化   这里与数据库中的持久性无关。

documentation