У меня есть зона класса, содержащая это:
/**
* @ORM\OneToMany(targetEntity = "Planification", mappedBy = "zone")
*/
protected $planifications;
и класс Planification с этим:
/**
* @ORM\ManyToOne(targetEntity = "Zone", inversedBy = "planifications")
* @ORM\JoinColumn(name = "zone_id", referencedColumnName = "id", nullable=true, onDelete = "SET NULL")
* @Expose
*/
protected $zone;
Но когда я захожу в базу данных, zone_id не устанавливается на null, когда я удаляю зону. И у меня есть код ошибки. Вижу только зону удалили и все.
Но если настроить по-другому: «удаляю зону, удаляю планирование», это работает:
В классе зоны:
/**
* @ORM\OneToMany(targetEntity = "Planification", mappedBy = "zone", orphanRemoval=true, cascade = {"remove"})
*/
protected $planifications;
В классе планификации:
/**
* @ORM\ManyToOne(targetEntity = "Zone", inversedBy = "planifications")
* @ORM\JoinColumn(name = "zone_id", referencedColumnName = "id", nullable=true)
* @Expose
*/
protected $zone;
Но мне не нужно удалять планировку при удалении зоны. Мне нужно установить для zone_id значение null.
Любая идея ?
Я только что получил проект от другого разработчика. Но я вижу что-то странное в dataloadfixture. Есть что-то с "addReference", "getReference", и в базе данных это не просто идентификатор ... возможно, поэтому он не совпадает с onDelete.
AddReference и getReference предназначены только для обмена объектами между приборами. Вы можете найти больше информации здесь: symfony.com/doc/master/bundles/DoctrineFixturesBundle/…
да, я знаю ... но я так заблудился, что пытаюсь избавиться от всех возможностей, ах. Наконец, я установил null с помощью функции в файле репозитория, когда я удалил зону ... потому что я вообще не нахожу ... это меня расстраивает: D
Можете ли вы проверить базу данных, установлен ли внешний ключ в таблице Planification для столбца «zone_id» для идентификатора таблицы зоны? Попробуйте "ПОКАЗАТЬ СОЗДАТЬ ТАБЛИЦУ planification;"
Ага ! Я видел внешний ключ :( ==> ОГРАНИЧЕНИЕ FK_6A4EBC3C9F2C3FAB FOREIGN KEY (zone_id) ССЫЛКИ ikc_zone (id),






У вас должно быть
Зона:
/**
* @ORM\OneToMany(targetEntity = "Planification", mappedBy = "zone")
*/
protected $planifications;
Планировки:
/**
* @ORM\ManyToOne(targetEntity = "Zone", inversedBy = "planifications")
* @ORM\JoinColumn(name = "zone_id", referencedColumnName = "id", nullable=true, onDelete = "SET NULL")
* @Expose
*/
protected $zone;
Затем используйте
php bin/console doctrine:schema:update --dump-sql
если это кажется правильным, используйте:
php bin/console doctrine:schema:update --force
ИЛИ ЖЕ:
Думаю, вы также можете сделать что-то вроде этого, попробуйте:
Зона:
/**
* @ORM\OneToMany(targetEntity = "Planification", mappedBy = "zone", orphanRemoval=true)
*/
protected $planifications;
Планировки:
/**
* @ORM\ManyToOne(targetEntity = "Zone", inversedBy = "planifications")
* @ORM\JoinColumn(name = "zone_id", referencedColumnName = "id", nullable=true)
* @Expose
*/
protected $zone;
да, это я. Но это не работает, и я не знаю, почему ... и моя БД уже находится в INNODB, потому что каскад удаления работает. (второй пример, который я написал). И я обновил базу данных схемы.
Какая у вас ошибка только с onDelete = "SET NULL"? Это должно сработать
У меня есть какая-либо ошибка ... стиль столбца zone_id имеет идентификатор в качестве значения.
У меня была такая же проблема, я мог решить ее, изменив движок базы данных моей таблицы базы данных MySQL с MyISAM на InnoDB (это была единственная таблица с type = MyISAM):
ALTER TABLE my_table ENGINE = InnoDB;
После этого :
php bin/console doctrine:schema:update --force
Привет, твое первое определение подходит ... не знаю, почему не работает.