【问题标题】:Problem saving from inversed side of many-to-many relationship从多对多关系的反面保存问题
【发布时间】:2011-09-07 00:55:08
【问题描述】:

我有两个实体:AudioPlaylistAudioTrack

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 并刷新实体管理器,但没有运气,所以我认为我的注释一定有问题(我正在使用this example from the Doctrine docs)。有什么想法吗?

【问题讨论】:

    标签: php doctrine-orm symfony


    【解决方案1】:

    这可能是因为您没有为反面设置cascade 属性。您必须明确定义 cascading 以使 Doctrine2 持久化任何相关实体。

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

    确保在调用AudioTrack::addAudioPlaylist() 时也将AudioTrack 添加到AudioPlaylist

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

    【讨论】:

    • $playlist->getAudioTracks()->add($this); 添加到addAudioPlaylist() 使其正常工作,但级联选项无效。不过,我需要修改addAudioPlaylist() 才能使其工作似乎很奇怪。特别是因为它是由 Symfony 自动生成的
    • @arms 我对级联选项的结果好坏参半,有时它们有效,有时无效。至于自动生成,它并不完全完美,如果遇到困难,我建议使用Doctrine2 manual。您可以从here 阅读有关使用关联管理方法的更多信息。
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    相关资源
    最近更新 更多