2012-02-17 108 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