Symfony-doctrine: нужно обнулить столбец, когда я удаляю его целевую сущность

У меня есть зона класса, содержащая это:

/**
 * @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.

Любая идея ?

Привет, твое первое определение подходит ... не знаю, почему не работает.

Maxi Schvindt 27.03.2018 13:50

Я только что получил проект от другого разработчика. Но я вижу что-то странное в dataloadfixture. Есть что-то с "addReference", "getReference", и в базе данных это не просто идентификатор ... возможно, поэтому он не совпадает с onDelete.

Jean-louis Gouwy 27.03.2018 15:36

AddReference и getReference предназначены только для обмена объектами между приборами. Вы можете найти больше информации здесь: symfony.com/doc/master/bundles/DoctrineFixturesBundle/…

Antoine Galluet 27.03.2018 16:57

да, я знаю ... но я так заблудился, что пытаюсь избавиться от всех возможностей, ах. Наконец, я установил null с помощью функции в файле репозитория, когда я удалил зону ... потому что я вообще не нахожу ... это меня расстраивает: D

Jean-louis Gouwy 27.03.2018 20:04

Можете ли вы проверить базу данных, установлен ли внешний ключ в таблице Planification для столбца «zone_id» для идентификатора таблицы зоны? Попробуйте "ПОКАЗАТЬ СОЗДАТЬ ТАБЛИЦУ planification;"

Jannes Botis 27.03.2018 20:17

Ага ! Я видел внешний ключ :( ==> ОГРАНИЧЕНИЕ FK_6A4EBC3C9F2C3FAB FOREIGN KEY (zone_id) ССЫЛКИ ikc_zone (id),

Jean-louis Gouwy 27.03.2018 21:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
6
2 398
2

Ответы 2

У вас должно быть

Зона:

/**
* @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, потому что каскад удаления работает. (второй пример, который я написал). И я обновил базу данных схемы.

Jean-louis Gouwy 27.03.2018 11:55

Какая у вас ошибка только с onDelete = "SET NULL"? Это должно сработать

Gregoire Ducharme 27.03.2018 11:58

У меня есть какая-либо ошибка ... стиль столбца zone_id имеет идентификатор в качестве значения.

Jean-louis Gouwy 27.03.2018 14:55

У меня была такая же проблема, я мог решить ее, изменив движок базы данных моей таблицы базы данных MySQL с MyISAM на InnoDB (это была единственная таблица с type = MyISAM):

ALTER TABLE my_table ENGINE = InnoDB;

После этого :

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

Другие вопросы по теме