Doctrine Fixtures: getOrder() с соединяемыми таблицами

Как вы управляете порядком загрузки приборов, когда загрузка двух приборов зависит друг от друга?

В моей схеме есть сущность 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) Загрузите приспособления книги. Пока вы создаете фикстуры, в методе load() вы можете создать объект «BookAuthor» для каждой книги, и объект книги должен быть настроен для сохранения объектов BookAuthor, которые он содержит, когда он сохраняется. Свойство book_authors внутри сущности книги может быть примерно таким:

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

Таким образом, в фикстурах Book фрагмент кода, который создает книгу, может быть (не забудьте указать дополнительные данные, это всего лишь пример):

// [...]
$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, что означает, что одно приспособление должно создавать экземпляр другого. Это, однако, выполнит основную задачу, поэтому я, скорее всего, приму ответ, если никто другой не знает выхода из угла, в который я себя загнал. Спасибо еще раз - person cantera; 19.02.2012
comment
Привет! Другой подход может заключаться в том, чтобы разрешить сущностям книги не иметь автора (возможно, есть книги, написанные неизвестными авторами), тогда вы можете сначала загрузить фикстуры для книг и авторов, а затем загрузить фикстуры BookAuthor. Кроме того, я думаю, что сущность BookAuthor должна быть создана вместе с книгой, но, возможно, у кого-то есть лучший подход к решению вашей проблемы. С Уважением - person alghimo; 19.02.2012