如何使Doctrine刷新/重新同步双向实体关联?

问题描述:

我有了与另一个实体双向多对一/一对多关系的实体:如何使Doctrine刷新/重新同步双向实体关联?

class BookShelf { 
    /** 
    * @OneToMany(targetEntity="Book", mappedBy="shelf", cascade={"persist"}) 
    */ 
public $books; 
} 
class Book { 
    /** 
    * @ManyToOne(targetEntity="BookShelf", inversedBy="books", cascade={"persist"}) 
    */ 
public $shelf; 
} 

我试图创建一个新的书,有对象的书架上市。

$book = new Book(); 
$book->shelf = $shelf; 
$em->persist($book); $em->flush(); 
$shelf->showBooks(); 

之后,$shelf->books不包含的书,而是它包含NULL。但是,本书已正确插入到数据库中,并且当我在另一页面上运行$shelf->showBooks()时,该书已正确列出。

我试着加入$em->refresh($book)$em->refresh($shelf)但它没有帮助,关联仍然没有刷新。

Doctrine manual does suggest,我可以用$shelf->books->add($book)手动同步的关联,但由于最初没有书籍,$shelf->booksNULL,我不能调用它的任何方法。

我该如何让Doctrine重新加载关联以包含新创建的关联实体?

(相关:"Doctrine and unrefreshed relationships"

而且后来我才发现,在同样的教义手册我挂告诉我的属性设置为在构造一个ArrayCollection,excatly从而使$shelf->books->add($book)确实工作。那就是:

public function __construct() { 
    $this->books = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

笨我。我会在这里发布答案,以防其他人碰巧找到同样的问题,只是很愚蠢。我想这不太可能。