Я в процессе преобразования устаревшего приложения 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);
Как я могу избежать этого?
Мне пришлось пройти тот же процесс в последнее время и, к счастью, есть простое решение, просто добавьте 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")