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

时间:2013-04-30 07:57:37

标签: doctrine

我有一个与另一个实体具有双向ManyToOne / OneToMany关系的实体:

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"

1 个答案:

答案 0 :(得分:1)

正如我后来注意到的那样,我链接的非常相同的 Doctrine手册告诉我在构造函数中将属性设置为ArrayCollection,以便$shelf->books->add($book) 执行工作。那就是:

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

愚蠢的我。我会在这里发布答案,以防其他人碰巧在寻找同样的问题之后,就像愚蠢一样。我想这不太可能。