2012-02-17 110 views
0

当两个灯具相互依赖加载时,如何控制灯具加载顺序?Doctrine Fixtures:getOrder()with Join Tables

我的模式有一个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

我不知道你究竟是如何设置你的关系,但我认为这是你应该做的:

1)根据作者灯具(应要求将产生的任何书籍)

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

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

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

// [...] 
$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); 

// [...] 

我希望它有帮助!

+0

感谢您的回复并提供了代码段。不幸的是,这种方法没有利用OrderedFixtureInterface功能,这意味着一个灯具必须创建另一个灯具的实例。然而,这将完成基本任务,所以如果没有其他人知道我走出自己的角落,我很可能会接受答案。 Thx再次 – cantera 2012-02-19 01:47:41

+0

嗨!另一种方法可能是让图书实体没有作者(可能有一些书籍由未知作者编写),那么你可以先加载书籍和作者的装置,然后加载BookAuthor装置。此外,我认为BookAuthor实体必须与书一起创建,但也许有人有更好的方法来解决您的问题。问候 – alghimo 2012-02-19 08:13:34