Каскадное удаление, каждый удаляется - PullRequest
1 голос
/ 23 сентября 2019
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

Я погуглил и нашел cascade="remove" or orphanRemoval=true, но оба выглядят немногоразные мои цели.

Как я могу решить?

1 Ответ

1 голос
/ 23 сентября 2019

Я вижу, что для обоих объектов PlaceInfo вы установили nullable=false, поэтому при удалении PlaceInfo нужно не только удалять объекты DistCache, управляемые entityManager, но и удалять их в базе данных.

Я предлагаю вам использовать preRemove событие из Обратных вызовов жизненного цикла доктрины .При событии удаления записи PlaceInfo вы запрашиваете все объекты DistCache, которые используют удаленный объект PlaceInfo, и сначала удаляете их.

Короче говоря, вам необходимо:

Add @ORM \ HasLifecycleCallbacksперед вашим классом для включения жизненных циклов.

Добавьте функцию preRemove в класс PlaceInfo:

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...