Проблема при попытке перезагрузить приборы - PullRequest
0 голосов
/ 13 сентября 2011

Когда я пытаюсь перезагрузить свои приборы, используя

php app / console доктрина: fixtures: load

Я получаю эту ошибку:

SQLSTATE [23000]: нарушение ограничения целостности: 1451 Невозможно удалить или обновить родительскую строку: сбой ограничения внешнего ключа (foo_db. Book, CONSTRAINT FK_C29271DD816C6140 FOREIGN KEY (author_id) ССЫЛКИ Author (id))

Ошибка отображается, когда отображается статус "> purging database".

Это мой код:

class Book{
...

/**
 * @ORM\ManyToOne(targetEntity="Author", inversedBy="books")
 */
private $author;

... 
}

class Author{
    ...
    /**
     * @ORM\OneToMany(targetEntity="Book", mappedBy="author")
     */
    private $books;

}

Подробнее: у моего босса тот же код, и у него нет этой ошибки.

Есть идеи?

sf 2.0.1 (только что обновлен) / ubuntu 10.10.

Ответы [ 2 ]

9 голосов
/ 13 сентября 2011

Если я правильно угадываю, вы используете базу данных MySQL.Если да, то вы столкнулись с ошибкой / проблемой в текущей версии библиотеки doctrine-fixtures для Doctrine2.Проблема в том, что они используют команду TRUNCATE для очистки текущих значений базы данных, но у этой команды есть проблема удаления внешних связей в MySQL.

См. эту проблему и эту в репозитории библиотеки GitHub для получения дополнительной информации и обходных путей.

В моем конкретном случае я запускаю эту команду из скрипта, поэтому, чтобы заставить ее работать правильно, я делаю:

php app/console doctrine:database:drop --force
php app/console doctrine:database:create

php app/console doctrine:schema:update --force

php app/console doctrine:fixtures:load --append

Таким образом, очистка выполняется командой drop, и добавление имеет тот же эффект, что и не добавление, поскольку база данных пуста при загрузке приборов.

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

Надеюсь, эта помощь поможет.

С уважением,
Мэтт

0 голосов
/ 18 июня 2019

Я создал простой класс подписчика на события для Symfony 4. Все, что вам нужно, чтобы решить проблему внешних ссылок на собственные ссылки, это добавить где-то класс ниже в ваш проект Symfony 4.

Этот подписчик срабатываетперед каждой командой CLI Symfony.В случае, если имя команды doctrine:fixtures:load, она выполняет очистку базы данных, но сначала выполняет SET FOREIGN_KEY_CHECKS = 0.

Это решает проблему без каких-либо других изменений.

use Doctrine\Common\DataFixtures\Purger\ORMPurger;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class ConsoleCommandEventSubscriber implements EventSubscriberInterface
{
    /**
    * @var EntityManagerInterface
    */
    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public static function getSubscribedEvents()
    {
        return [
            ConsoleEvents::COMMAND => 'onCommand',
        ];
    }

    public function onCommand(ConsoleCommandEvent $event)
    {
        if ($event->getCommand()->getName() === 'doctrine:fixtures:load') {
            $this->runCustomTruncate();
        }
    }

    private function runCustomTruncate()
    {
        $connection = $this->entityManager->getConnection();

        $connection->exec('SET FOREIGN_KEY_CHECKS = 0');

        $purger = new ORMPurger($this->entityManager);
        $purger->setPurgeMode(ORMPurger::PURGE_MODE_DELETE);
        $purger->purge();

        $connection->exec('SET FOREIGN_KEY_CHECKS = 1');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...