Doctrine Fixtures:带有连接表的getOrder()

时间:2012-02-17 06:11:49

标签: symfony doctrine doctrine-orm fixtures

当两个灯具相互依赖加载时,如何控制灯具加载的顺序?

我的架构有一个Book实体,一个Author实体和一个BookAuthor实体。书籍可以有很多作者,BookAuthor是必需的,因为它有一个名为“main”的附加字段,表明作者是否是该书的主要作者。

在BookFixtures中,我引用了BookAuthorFixtures:

$book1->addBookAuthor($manager->merge($this->getReference('book-author-1')));

在BookAuthorFixtures中,我引用了BookFixtures:

$bookAuthor1->setBook($manager->merge($this->getReference('book-1')));

必须首先加载其中一个灯具,这意味着它引用的灯具是未定义的索引。

有解决这个问题的技巧吗?

question解决了几乎相同的问题,但配置不同,尽管已接受答案,但问题仍未得到解决。

1 个答案:

答案 0 :(得分:1)

我不确切地知道你是如何建立你的人际关系的,但我认为这就是你应该做的:

1)加载作者固定装置(它们应该要求创建任何书籍)

2)装入书籍装置。在创建灯具时,在load()方法中,您可以为每本书创建“BookAuthor”实体,并且应该将书籍实体配置为保存持久存在的BookAuthor实体。书籍实体内的“book_authors”属性可能与此类似:

/**
 * @ORM\OneToMany(targetEntity="your\bundle\Entity\BookAuthor",mappedBy="book", cascade={"persist", "remove"})
 */
protected $book_authors;

所以在Book fixtures中,创建一本书的代码片段可能是(不要忘记设置任何额外的数据,它只是一个样本):

// [...]
$book = new Book();
$book->setTitle( 'xxx' )
// Set more data...
$book_author = new BookAuthor();
$book_author->setAuthor( $manager->merge($this->getReference('author-1')) );
$book_author->setBook( $book );
$book->addBookAuthor( $book_author );

$em->persist( $book );

// [...]

我希望它有所帮助!