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()
用来找出已从集合中删除的实体.