Фикстури на доктрината: getOrder() с 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')));

Едно от приспособленията трябва да бъде заредено първо, което означава, че приспособлението, което препраща, е недефиниран индекс.

Има ли трик за решаване на този проблем?

Този въпрос адресира почти същия проблем, но конфигурацията е различна и проблемът остана неразрешен въпреки приетия отговор.


person cantera    schedule 17.02.2012    source източник


Отговори (1)


Не знам как точно сте изградили отношенията си, но мисля, че трябва да направите следното:

1) Заредете приспособленията за автор (те трябва да изискват създаване на книги)

2) Заредете Book Fixtures. Докато създавате приспособленията, във вашия метод 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 );

// [...]

Надявам се, че помогна!

person alghimo    schedule 17.02.2012
comment
Благодаря, че се отзовахте и предоставихте кодовия фрагмент. За съжаление този подход не се възползва от функцията OrderedFixtureInterface, което означава, че едно приспособление трябва да създаде екземпляр на друго. Това обаче би изпълнило основната задача, така че вероятно ще приема отговора, ако никой друг не знае изход от ъгъла, в който съм се нарисувал. Thx отново - person cantera; 19.02.2012
comment
здрасти Друг подход може да бъде да позволите на книжните обекти да нямат автор (може да има някои книги, написани от неизвестни автори), тогава можете първо да заредите фиксираните файлове за книги и автори и след това да заредите фиксираните файлове на BookAuthor. Освен това мисля, че обектът BookAuthor трябва да бъде създаден заедно с книгата, но може би някой има по-добър подход за разрешаване на проблема ви. за разбирането - person alghimo; 19.02.2012