Doctrine orm symfony4如何使用实体关系创建DataFixture

Doctrine orm symfony4如何使用实体关系创建DataFixture,doctrine-orm,symfony4,Doctrine Orm,Symfony4,在Symfony4.2下,我有一个翻译实体(id,gb\U名称,fr\U名称)和一个位置国家实体(id,ISO3166-2名称:gb,fr,DE.,翻译id) 我定义了一个包含255个国家的CSV文件(“GB”、“大不列颠”、“Angleterre”…),并希望使用DataFixture将其推送到Translate和LocationCountry实体表中 我仔细阅读 和 src/DataFixtures/translateTextures.php: if ($csv_handle) {

在Symfony4.2下,我有一个翻译实体(id,gb\U名称,fr\U名称)和一个位置国家实体(id,ISO3166-2名称:gb,fr,DE.,翻译id)

我定义了一个包含255个国家的CSV文件(“GB”、“大不列颠”、“Angleterre”…),并希望使用DataFixture将其推送到Translate和LocationCountry实体表中

我仔细阅读

src/DataFixtures/translateTextures.php:

if ($csv_handle) {
        while ($item = fgetcsv($csv_handle, $csv_max_line_length, $csv_delimiter, $csv_enclosure)) {
            $obj = new Translate();
            $obj->setGbValue($item[1]);
            $obj->setFrValue($item[2]);
            $this->addReference('country'.$item[0], $obj);
            $manager->persist($obj);
        }
        fclose($csv_handle);
    }

    $manager->flush();
    if ($csv_handle) {
        while ($item = fgetcsv($csv_handle, $csv_max_line_length, $csv_delimiter, $csv_enclosure)) {
            $translate_country = $this->getReference('country'.$item[0]);
            $obj = new LocationCountry();
            $obj->setIso3166Name($item[0]);
            $obj->setTranslate($translate_country);
            $manager->persist($obj);
        }
        fclose($csv_handle);
    }

    $manager->flush();
}

public function getDependencies() {
    return array(
        Translate::class,
    );
}
我不确定addReference是否应该在flush()之前

src/DataFixtures/LocationCountryFixtures.php:

if ($csv_handle) {
        while ($item = fgetcsv($csv_handle, $csv_max_line_length, $csv_delimiter, $csv_enclosure)) {
            $obj = new Translate();
            $obj->setGbValue($item[1]);
            $obj->setFrValue($item[2]);
            $this->addReference('country'.$item[0], $obj);
            $manager->persist($obj);
        }
        fclose($csv_handle);
    }

    $manager->flush();
    if ($csv_handle) {
        while ($item = fgetcsv($csv_handle, $csv_max_line_length, $csv_delimiter, $csv_enclosure)) {
            $translate_country = $this->getReference('country'.$item[0]);
            $obj = new LocationCountry();
            $obj->setIso3166Name($item[0]);
            $obj->setTranslate($translate_country);
            $manager->persist($obj);
        }
        fclose($csv_handle);
    }

    $manager->flush();
}

public function getDependencies() {
    return array(
        Translate::class,
    );
}
若我删除addReference,那个么Translate实体填充得很好

但对于上面的代码,它返回错误:

In SymfonyFixturesLoader.php line 76:                                                                                                                                             
The "App\Entity\Translate" fixture class is trying to be loaded, but is not available. Make sure this class is defined as a service and tagged with "doctrine.fixture.orm". 
我认为正确使用:

use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use App\Entity\LocationCountry;
use App\Entity\Translate;

感谢您的帮助

按字母顺序加载夹具文件;这就是为什么会出现错误。您可以考虑在函数中使用函数<代码> GETOrgs< /Cord>,以便设置哪一个将首先加载。< /P> 编辑:

出现错误是因为在
getDependencies
方法中没有提供正确的类:

public function getDependencies() {
    return array(
        TranslateFixtures::class,
    );
}

在本例中,我只是删除src/DataFixtures/translateTextures.php

并将src/DataFixtures/LocationCountryFixtures.php更改为执行所有作业:

if ($csv_handle) {
    while ($item = fgetcsv($csv_handle, $csv_max_line_length, $csv_delimiter, $csv_enclosure)) {
            //$translate_country = $this->getReference('country'.$item[0]);
            $country = new LocationCountry();
            $translate_country = new Translate();
            $translate_country->setGbValue($item[1]);
            $translate_country->setFrValue($item[2]);
            $country->setIso3166Name($item[0]);
            $country->setTranslateCountry($translate_country);
            $manager->persist($translate_country);
            $manager->persist($country);
        }
        fclose($csv_handle);
    }
    $manager->flush();

正如我在上所读到的,来自
DependentFixtureInterface
getDependencies
方法应该会出售它,不是吗?@bcag2是的,你是对的。我不知道这个方法。所以,我发现了你的错误。似乎您在
getDependencies
方法中没有提供正确的类。它不是
Translate
,而是
translatexture
,谢谢@titili!