symfony4 Как создать DataFixtures с отношениями сущностей - PullRequest
0 голосов
/ 19 февраля 2019

В Symfony4.2 у меня есть Translate сущность (id, gb_name, fr_name) и LocationCountry сущность (id, ISO3166-2 name: GB, FR, DE…,translate_id)

Я определяю файл CSV с 255 странами ("ГБ", "Великобритания", "Англетер" ...) и хочу поместить его в таблицы сущностей Translate и LocationCountry с помощью DataFixture.

Я внимательно прочитал https://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html#sharing-objects-between-fixtures
и
php создать приборы с автоматическими связями

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 Перевести сущность хорошо заполнена.

Но с кодом, приведенным выше, он возвращает ошибку:

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;

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

В этом случае я просто удаляю 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();
0 голосов
/ 19 февраля 2019

Doctrine загружает файлы приборов в алфавитном порядке;вот почему вы получаете ошибку.Вы можете использовать функцию getOrder в своих приборах, чтобы установить, какая из них будет загружаться первой.

РЕДАКТИРОВАТЬ:

Вы получаете ошибку, потому что вы не указали правильный класс вВаш getDependencies метод:

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