【问题标题】:Doctrine Fixtures: getOrder() with Join TablesDoctrine Fixtures:带有连接表的 getOrder()
【发布时间】:2012-02-17 06:11:48
【问题描述】:

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

我的架构有一个 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')));

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

有解决这个问题的诀窍吗?

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

【问题讨论】:

    标签: symfony doctrine doctrine-orm fixtures


    【解决方案1】:

    我不知道你是如何建立关系的,但我认为这是你应该做的:

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

    2) 加载图书固定装置。在您创建固定装置时,在您的 load() 方法中,您可以为每本书创建“BookAuthor”实体,并且应该将 book 实体配置为保存它在持久化时保存的 BookAuthor 实体。 book 实体中的属性“book_authors”可能类似于:

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

    所以在 Book 装置中,创建一本书的代码 sn-p 可能是(不要忘记设置任何额外的数据,这只是一个示例):

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

    希望对你有帮助!

    【讨论】:

    • 感谢您回复并提供代码 sn-p。不幸的是,这种方法没有利用 OrderedFixtureInterface 特性,这意味着一个夹具必须创建另一个夹具的实例。但是,这将完成基本任务,因此如果没有其他人知道走出我画的角落的出路,我可能会接受答案。再次感谢
    • 嗨!另一种方法可能是允许书籍实体没有作者(可能有一些未知作者撰写的书籍),然后您可以首先加载书籍和作者的固定装置,然后加载 BookAuthor 固定装置。此外,我认为 BookAuthor 实体必须与书一起创建,但也许有人有更好的方法来解决你的问题。问候
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2015-02-08
    相关资源
    最近更新 更多