4

私がMedia取り組んでいるアプリに、他のいくつかのエンティティと関連付けられているエンティティがあります: SpeakerTagCategoryなど。

以下のコードでは、いくつかのテスト データを作成するために作成したフィクスチャを示しています。データ間の多数の関係をセットアップして割り当てるには、明らかに非常に時間がかかります。

public function load(ObjectManager $manager)
{
    $videoType = new Mediatype();
    $videoType->setName('video');
    $videoType->setType('video');

    $manager->persist($videoType);

    $speaker1 = new Speaker();
    $speaker1->setName('Joe Bloggs');

    $speaker1->setBiography('Joe Bloggs bio.');

    $manager->persist($speaker1);

    $category1 = new Category();
    $category1->setName('PHP');
    $category1->setSlug('php');

    $manager->persist($category1);

    $tag1 = new Tag();
    $tag1->setName('PHPNW');
    $tag1->setSlug('phpnw');

    $manager->persist($tag1);

    $video1 = new Media();
    $video1->setMediatype($videoType);
    $video1->setSpeakers(
        new ArrayCollection(
            array(
                $speaker1
            )
        )
    );

    $video1->setCategories(
        new ArrayCollection(
            array(
                $category1
            )
        )
    );

    $video1->setTags(
        new ArrayCollection(
            array(
                $tag1
            )
        )
    );

    $video1->setDate(new \Datetime());
    $video1->setCreationDate(new \DateTime());
    $video1->setTitle('My video about PHP');
    $video1->setDescription('A video about PHP!');
    $video1->setContent('http://some.video-url.com');
    $video1->setLength('20:00:00');
    $video1->setRating(2.5);
    $video1->setVisits(100);
    $video1->setLanguage('EN');
    $video1->setHostName('PHP');
    $video1->setHostUrl('php');
    $video1->setStatus('pub');
    $manager->persist($video1);
    $manager->flush();
}

ここで、このフィクスチャを実際のデータに置き換えて、1 つのフィクスチャに 12 個ほどのMediaエンティティをロードしたいと考えています。何十回もコピーして貼り付けてデータを変更することはできますが、それは面倒で維持が困難です。このように同じタイプの多数のエンティティをロードする良い方法はありますか?

4

1 に答える 1

3

doctrine/data-fixturesバンドルは、まさに私が望んでいたことをすでに実行していることに気付きました。

これを行うには、各エンティティを独自のフィクスチャにロードし、次$this->addReference('admin-user', $user);を使用して別のフィクスチャからアクセスします。$this->getReference('admin-user');

依存関係のあるフィクスチャをロードするのも簡単です:

public function getDependencies()
{
    // fixture classes that this fixture is dependent on
    return array('MyDataFixtures\MyOtherFixture'); 
}

だから今私のフィクスチャは次のようになります:

public function load(ObjectManager $manager)
{
    $video1 = new Media();
    $video1->setMediatype($this->getReference('video'));
    $video1->setSpeakers(
        new ArrayCollection(
            array(
                $this->getReference('joe-bloggs')
            )
        )
    );

    $video1->setCategories(
        new ArrayCollection(
            array(
                $this->getReference('php')
            )
        )
    );

    $video1->setTags(
        new ArrayCollection(
            array(
                $this->getReference('phpnw')
            )
        )
    );

    $video1->setDate(new \Datetime());
    $video1->setCreationDate(new \DateTime());
    $video1->setTitle('My video about PHP');
    $video1->setDescription('A video about PHP!');
    $video1->setContent('http://some.video-url.com');
    $video1->setLength('20:00:00');
    $video1->setRating(2.5);
    $video1->setVisits(100);
    $video1->setLanguage('EN');
    $video1->setHostName('PHP');
    $video1->setHostUrl('php');
    $video1->setStatus('pub');

    $manager->persist($video1);
    $manager->flush();
}

/**
 * Load this fixtures dependencies
 * @see https://github.com/doctrine/data-fixtures
 *
 * @return array
 */
public function getDependencies()
{
    return array(
        '...\LoadMediatypeData',
        '...\LoadSpeakerData',
        '...\LoadCategoryData',
        '...\LoadTagData'
    );
}
于 2013-03-27T20:16:53.840 に答える