Проблема сохранения с обратной стороны отношения «многие ко многим» - PullRequest
2 голосов
/ 07 сентября 2011

У меня есть две сущности: AudioPlaylist и AudioTrack.

AudioPlaylist.php:

/**
 * @ORM\ManyToMany(targetEntity = "AudioTrack", inversedBy = "audioPlaylists")
 * @ORM\JoinTable(name = "audioplaylist_audiotrack")
 *
 * @var ArrayCollection
 */
protected $audioTracks;

AudioTrack.php:

/**
 * @ORM\ManyToMany(targetEntity = "AudioPlaylist", mappedBy = "audioTracks")
 * 
 * @var ArrayCollection
 */
 protected $audioPlaylists;

Моя проблема в том, что когда я звоню $audioTrack->addAudioPlaylist($audioPlaylist), таблица audioplaylist_audiotrack не обновляется. Я ожидаю, что в таблицу будет добавлена ​​новая строка, обозначающая отношения между двумя объектами. Все отлично работает для обратного, хотя $audioPlaylist->addAudioTrack($audioTrack) добавляет новую строку.

Я стараюсь сохранять $audioTrack и очищать менеджер сущностей, но не повезло, поэтому я предполагаю, что в моих аннотациях должно быть что-то не так (я использую этот пример из документации Doctrine) . Есть идеи?

1 Ответ

6 голосов
/ 07 сентября 2011

Это возможно потому, что вы не установили свойство cascade для своей обратной стороны. Вы должны явно определить каскад , чтобы Doctrine2 сохранила любые связанные объекты.

/**
 * @ORM\ManyToMany(targetEntity = "AudioPlaylist",
 *                     mappedBy = "audioTracks",
 *                      cascade = {"persist", "remove"})
 * 
 * @var ArrayCollection
 */
protected $audioPlaylists;

Убедитесь, что вы также добавили свой AudioTrack к AudioPlaylist, когда звоните AudioTrack::addAudioPlaylist():

public function addAudioPlaylist(AudioPlaylist $playlist)
{
    $this->getAudioPlaylists()->add($playlist);
    $playlist->getAudioTracks()->add($this);
}
...