Как установить каскад M: 1 в ноль, используя ассоциации Doctrine2? - PullRequest
1 голос
/ 15 июля 2011

Q немного сомнительно, простите за это.

Я хочу удалить объект песни:

Мои ассоциации 1: M отлично работают с каскадом = все. Например. рейтинги, связанные с песней, могут быть удалены.

Мой М: 1 Я не знаю, как это сделать. В настоящее время я устанавливаю эти свойства в null, затем сохраняю эти свойства, затем удаляю песню. Например, альбом и исполнитель должны остаться, так как они связаны с другими песнями.

Выдержка:

/**
 * OWNING SIDE
 * @var My\Entity\Album
 * @ManyToOne(targetEntity="Album", inversedBy="songs")
 */
private $album;

/**
 * INVERSED SIDE
 * @var Doctrine\Common\Collections\ArrayCollection
 * @OneToMany(targetEntity="Similar", mappedBy="songa", cascade={"all"})
 * @OrderBy({"id" = "DESC"})
 */
private $similarsa;

Я хочу продолжать использовать каскадирование ассоциаций, а не на уровне БД. Любой совет по использованию $ em-> remove ($ song) без дополнительного сохранения моего M: 1 до нуля?

1 Ответ

1 голос
/ 08 августа 2011

Я нашел это со следующим:

В моей сущности песни (родителя):

/** @PreRemove */
public function preRemove()
{
    $em = \Zend_Registry::get('doctrine')->getEntityManager();
    $em->getRepository('My\Entity\Similar')->removeSong($this);
    $em->getRepository('My\Entity\Rating')->removeSong($this);
}

Эти методы (в хранилище) выглядят так:

/**
 * Removes similars with song
 */
public function removeSong($song)
{
    $ratings = $this->getSong($song);
    foreach ($ratings as $rating) $this->getEntityManager()->remove($rating);
    $this->getEntityManager()->flush();
}

А в моих похожих и рейтинговых чеках:

/** @PreRemove */
public function preRemove()
{
    $this->winner = $this->loser = null;
}
...