保存相关实体Doctrine / Symfony2

时间:2015-08-12 10:20:12

标签: php symfony doctrine-orm

我有一个具体问题。我有两个实体:

    class MyPlaylist {
   ...
    /**
     * @var Array 
     * @ORM\OneToMany(targetEntity="MyPlaylistContent", mappedBy="myPlaylist", orphanRemoval=true)
     * @ORM\OrderBy({"position" = "DESC"})
     */
    private $myPlaylistItems;

class MyPlaylistContent {
....

    /**
     * @ORM\ManyToOne(targetEntity="MyPlaylist", inversedBy="myPlaylistItems")
     */
    private $myPlaylist;

现在我的服务

中有这个
....    
    $myPlaylist = new MyPlaylist();
    $myPlaylist->setUser($user);
    $myPlaylist->setActive(true);

    // add tracks
    foreach ($playlist->getMyPlaylistItems() as $item) {
      $entity = new MyPlaylistContent();
      $entity->setTrack($item->getTrack());
      $entity->setMyPlaylist($myPlaylist);
      $this->em->persist($entity);
    }

    $this->em->persist($myPlaylist);
    $this->em->flush();

    \Doctrine\Common\Util\Debug::dump($myPlaylist);

    return $myPlaylist;

所以,我返回一个新的播放列表。如果我查看数据库,一切正常。我有两个实体和MyPlaylistContent - 3个曲目。但是

\ Doctrine \ Common \ Util \ Debug :: dump($ myPlaylist); 显示下一个

  

["有源"] => bool(true)[" myPlaylistItems"] => array(0){}

在页面上,应用显示空播放列表(没有曲目)。如果我刷新页面,我可以看到所有曲目。

关键是,如果您打开页面,控制器将调用服务,构建内容并返回列表作为响应。 它看起来是同一个例子,但它对我不起作用 http://symfony.com/doc/current/book/doctrine.html#saving-related-entities

这里有什么问题?为什么我没有获得当前实体的曲目?

1 个答案:

答案 0 :(得分:0)

您忘记将MyPlaylistContent添加到MyPlaylist

将此代码段用于foreach

$myPlaylist->addMyPlaylistContent($myPlaylistContent);

当然更改名称或实施方法

首先要注意:这是因为对象是“普通”的php对象,它们与学说无关,因此,关系只是一个学说概念。 doctrine中的EntityManager将处理这种进程,而不是php本身。如果您查看类方法,您可能会注意到这些对象之间没有“连接”(赋值)。如果您愿意,可以修改MyPlaylistContent,以便在分配后将其自身添加到MyPlaylist。 像

这样的东西

类MyPlaylistContent {     [...]

public function setMyPlaylist(MyPlaylist $mp) 
{
    $this->myPlaylist = $myPlaylist;
    $mp->addMyPlaylistContent($this);

    return $this;
}

第二个注意事项:希望你的名字更能体现这些名称:)