symfony4 如何创建具有实体关系的 DataFixtures
symfony4 How create DataFixtures with entities relations
在 Symfony4.2 下,我有一个 Translate 实体(id,gb_name,fr_name)和 LocationCountry entity (id, ISO3166-2 name: GB,FR, DE..., translate_id)
我定义了一个包含 255 个国家("GB"、"Great Britain"、"Angleterre"…)的 CSV 文件,我想使用 DataFixture 将其推送到 Translate 和 LocationCountry 实体表中。
我仔细看了https://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html#sharing-objects-between-fixtures
和
php create fixtures with automatic relations
src/DataFixtures/TranslateFixtures.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();
我不确定 addReference 应该在 flush() 之前 ?
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]);
$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 翻译实体很好填充。
但是上面的代码,returns错误:
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;
感谢您的帮助
Doctrine 按字母顺序加载夹具文件;这就是你得到错误的原因。你可以考虑在你的灯具中使用函数 getOrder
来设置先加载哪个。
编辑:
您收到错误消息是因为您没有在 getDependencies
方法中提供正确的 class:
public function getDependencies() {
return array(
TranslateFixtures::class,
);
}
在这种情况下,我只是删除 src/DataFixtures/TranslateFixtures。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();
在 Symfony4.2 下,我有一个 Translate 实体(id,gb_name,fr_name)和 LocationCountry entity (id, ISO3166-2 name: GB,FR, DE..., translate_id)
我定义了一个包含 255 个国家("GB"、"Great Britain"、"Angleterre"…)的 CSV 文件,我想使用 DataFixture 将其推送到 Translate 和 LocationCountry 实体表中。
我仔细看了https://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html#sharing-objects-between-fixtures
和
php create fixtures with automatic relations
src/DataFixtures/TranslateFixtures.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();
我不确定 addReference 应该在 flush() 之前 ?
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]);
$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 翻译实体很好填充。
但是上面的代码,returns错误:
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;
感谢您的帮助
Doctrine 按字母顺序加载夹具文件;这就是你得到错误的原因。你可以考虑在你的灯具中使用函数 getOrder
来设置先加载哪个。
编辑:
您收到错误消息是因为您没有在 getDependencies
方法中提供正确的 class:
public function getDependencies() {
return array(
TranslateFixtures::class,
);
}
在这种情况下,我只是删除 src/DataFixtures/TranslateFixtures。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();