级联删除,每一个都删除

时间:2019-09-23 13:11:31

标签: php mysql doctrine

class DistCache
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\PlaceInfo")
     * @ORM\JoinColumn(nullable=false)
     */
    private $placeOne;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\PlaceInfo")
     * @ORM\JoinColumn(nullable=false)
     */
    private $placeTwo;

此表有两个成员,都与PlaceInfo类相关。 并且PlaceInfo类没有与DistCache类相关的成员。

然后我要delete the DistCache entry when one of two members(placeOne or placeTwo) is deleted

我在Google周围搜索并发现了cascade="remove" or orphanRemoval=true,但两者的目的都不一样。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

我可以看到,您为两个PlaceInfo对象都设置了nullable=false,因此在删除PlaceInfo时,不仅必须删除由entityManager管理的DistCache实体,还必须删除数据库中的实体。

我建议您可以使用Doctrine life cycle callbacks中的preRemove事件。 在PlaceInfo记录的remove事件上,您查询所有使用已删除的PlaceInfo对象的DistCache对象,并首先将其删除。

简而言之,您需要:

在课程之前添加@ORM \ HasLifecycleCallbacks以启用生命周期。

在PlaceInfo类中添加preRemove函数:

/**
 * @ORM\PreRemove
 * @param LifecycleEventArgs $event
 */
public function removeDistCache(LifecycleEventArgs $event)
{
     $em = $event->getEntityManager();
     // Use $em to query and delete the DistCache entities

}