Ассоциация Doctrine 2 без ограничений внешнего ключа

Я в процессе преобразования устаревшего приложения PHP в Symfony 2. Данные приложения не очень согласованы на данный момент, поэтому я хотел бы избежать создания ограничений внешнего ключа. У меня есть следующая аннотация в моем классе объектов «Продукт»:

class Product { // some definitions /** * @ORM\ManyToOne(targetEntity="Manufacturer") * @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id" ) */ private $Manufacturer; } 

Когда я делаю app/console doctrine:schema:update , я получаю команду SQL

  ALTER TABLE products ADD CONSTRAINT FK_F6FA18741C3BF575 FOREIGN KEY (manufacturer_id) REFERENCES manufacturer(id); 

Как я могу избежать этого?

Solutions Collecting From Web of "Ассоциация Doctrine 2 без ограничений внешнего ключа"

Мне пришлось пройти тот же процесс в последнее время и, к счастью, есть простое решение, просто добавьте nullable=true в аннотацию столбца.

Это будет работать до тех пор, пока существующие данные верны, в моем случае мне пришлось изменить 0 на NULL и сменить ключи, которые больше не существовали до NULL.

В основном вы не можете предотвратить создание команд sql. По крайней мере, не без погружения в код Doctrine.

Однако вам не нужно применять ограничения к вашей базе данных. D2 будет отлично работать без них.

Вы должны оставить определения ManyToMany и JoinColumn и обработать свойство Manufacturer в своем специализированном репозитории продуктов с помощью общедоступного метода getManufacturer, который расширяет автоматически созданный репозиторий продуктов.

У меня была проблема с той же командой. Я получил исключение:

SQLSTATE [HY000]: Общая ошибка: 1005 Не удается создать таблицу «xxx. # Sql-66c_3e» (errno: 150)

Для меня это помогло объявить столбец уникальным (в вашем случае id).

Теперь app/console doctrine:schema:update снова выполняется отлично.

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

 select p.id from product p left join manufacturer m on m.id=p.manufakturer_id where m.id is null 

Попробуйте добавить onDelete = "CASCADE", как

 * @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id", onDelete="CASCADE")