Symfony4: DataFixtures с внешними ключами и усечением / сбросом значений автоинкремента - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь сгенерировать данные базы данных с помощью соответствующей доктрины Symfony DataFixture.

Если я загружаю данные несколько раз, выполняя это:

php bin/console doctrine:fixtures:load

Он очищает мою базу данных и генерирует данные заново. Однако это не сбрасывает значения автоинкремента. Если я запускаю эту команду с параметром --purge-with-truncate, она делает именно это, но затем я получаю жалобу на ограничения внешнего ключа:

    $ php bin/console doctrine:fixtures:load --env=test -n --purge-with-truncate
> purging database

In AbstractMySQLDriver.php line 68:

An exception occurred while executing 'TRUNCATE property':

SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constraint (`my_db_name`.`user_property`, CONSTRAINT `fk_property_name` FOREIGN KEY (`propert
y_name`) REFERENCES `my_db_name`.`property` (`name`))

Так что да, конечно, я добавил зависимости, когда создавал свои приборы в трех разных классах. Свойство UserProperty зависит как от пользователя, так и от свойства.

Поэтому я реализовал DependentFixtureInterface, добавив следующий метод в мой класс UserPropertyFixtures:

public function getDependencies()
{
    return [
        UserFixtures::class,
        PropertyFixtures::class,
    ];
}

Я что-то упустил или это никогда не работало?

Есть ли другая опция для сброса значений автоинкремента?

1 Ответ

0 голосов
/ 18 июля 2018

Насколько я понял, для этого нет решения. Я нашел решение не ссылаться на определенный идентификатор для тестовых значений. DataFixtures позволяют создавать «именованные» значения, к которым вы можете обращаться в других приборах.

Однако, если вы хотите обрезать таблицу и используете внешние ключи, вы должны выполнить DROP и CREATE вручную в правильном порядке. Не приятно ....

Если у кого-то есть решение, мне все равно будет интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...