Doctrine:多对多在事件侦听器中删除关联对象

trr*_*rrm 3 doctrine symfony doctrine-orm

我有很多这样的协会

Entity Car
{
   /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="User", inversedBy="cars", fetch="EXTRA_LAZY")
     * @ORM\JoinTable(
     *  name="cars_users",
     *  joinColumns={
     *      @ORM\JoinColumn(name="car_id", referencedColumnName="id")
     *  },
     *  inverseJoinColumns={
     *      @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     *  }
     * )
     */
    protected $users; 

    /**
     * @param $user
      */
    public function removeUser(User $user)
    {
        if (!$this->users->contains($user)) {
            return;
        }

        $this->users->removeElement($user);
        $user->removeCar($this);

        return $this;
    }
}

Entity User 
{
/**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="Car", mappedBy="users")
     */
    protected $cars;
}
Run Code Online (Sandbox Code Playgroud)

在我的控制器中我有

$carA = getRandomCar();
$userB = getAUserThatBelongToCarA();

//remove association between Car A and User B
$carA->removesUser($userB);
doctrineUpdateCar($carA);
Run Code Online (Sandbox Code Playgroud)

我有一个Doctrine Listener CarListener我试图找出是否User已经删除了该侦听器并告诉它User是哪个.

我试过preUpdate postUpdate postFlush但无法找到一种方法来获取$userB对象内部CarListener

Jas*_*wer 10

事件

我建议您使用onflush事件让侦听器/订阅者监听,因为它是在计算更改后调度的,但是在执行对数据库的任何操作之前.这使得它非常理想,因为您可以访问即将进行的所有更改,但实际上还没有将它们写入数据库(因此您可以选择中止).

侦听器/订阅者传递一个OnFlushEventArgs对象,您可以从该对象访问UnitOfWork.工作单元有5种方法来收集即将发生的变化:

  • getScheduledEntityInsertions()
  • getScheduledEntityUpdates()
  • getScheduledEntityDeletions()
  • getScheduledCollectionUpdates()
  • getScheduledCollectionDeletions()

集合

你在做什么是删除User从收集Car::$users和移除Car从集合User::cars.

因此,实际上没有实体被删除,没有任何字段被更改.相反,你正在改变收藏品.换句话说,这是getScheduledCollectionUpdates()你想要看的.

返回的集合getScheduledCollectionUpdates()PersistentCollection的一个实例,它具有这些方法来告诉您已更改的内容:

  • getInsertDiff()
  • getDeleteDiff()

在您的情况下,您可以getDeleteDiff()用来找出已从集合中删除的实体.