我有一个具体问题。我有两个实体:
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
这里有什么问题?为什么我没有获得当前实体的曲目?
答案 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;
}
第二个注意事项:希望你的名字更能体现这些名称:)