Учение об отношениях один-ко-многим И многие-к-одному

У меня есть две таблицы. Я хочу установить отношения один-ко-многим, но также отношения многие-к-одному.

Страница может иметь один фон — это фон страницы.

Страница также может иметь много фонов — это коллекция загруженных пользователями фонов, из которых будет выбран первый для отношений.

Другими словами, пользователь выбирает фон из набора предопределенных фонов или один из многих фонов, которые он загрузил, чтобы опробовать.

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

Хотя doctrine и symfony допускают указанную выше конфигурацию, при удалении страницы Doctrine полностью игнорирует cascade = «{remove}» в свойстве Backgrounds и, конечно, возникает исключение при попытке удалить страницу перед удалением ее пользовательских фонов.

Что я делаю неправильно?

class Background
{
/**
* @var string
*
* This attribute is for user uploaded backgrounds.
*
* @ORM\ManyToOne(targetEntity="Page",inversedBy="customBackgrounds")
* @ORM\JoinColumn(name="page_id",referencedColumnName="id")
*/
protected $page;

/**
* @var string
*
* This field helps admins to gauge popularity
*
* @ORM\OneToMany(targetEntity="Page",mappedBy="background")
*/
protected $pages;
}class Page
{
/**
* @var string
*
* @ORM\ManyToOne(targetEntity="Background",inversedBy="pages")
* @ORM\JoinColumn(name="background_id",referencedColumnName="id", nullable=true, onDelete="SET NULL")
*/
protected $background;

/**
* @ORM\OneToMany(targetEntity="Background", mappedBy="page", cascade={"remove"})
* @ORM\OrderBy({"id" = "ASC"})
*/
protected $customBackgrounds;
}

2

Решение

пытаться
@ORM\JoinColumn(name="page_id",referencedColumnName="id", onDelete="SET NULL") и сделать обновление схемы.

РЕДАКТИРОВАТЬ: Проблема на уровне базы данных, а не на уровне доктрины, об этом позаботится cascade = «remove», однако внешний ключ для page_id остается, onDelete указывает, что если столбец с этим внешним отношением будет удален, установите поле в «значение» в этом случае его ноль. если вы —dump-sql до обновления схемы, вы увидите добавление запроса, что-то вроде «ON DELETE SET *»

Больше информации можно найти здесь:
http://www.techonthenet.com/oracle/foreign_keys/foreign_null.php

4

Другие решения

Единственное, что вы можете сделать, это использовать прослушиватель событий в вашей сущности, а когда страница удаляется, установить ее фон в ноль или другой идентификатор

0

/**
* @ORM\OneToMany(targetEntity="Background", mappedBy="page", orphanRemoval=true)
* @ORM\OrderBy({"id" = "ASC"})
*/
protected $customBackgrounds;

Должен сделать свое дело (Доктрина — Удаление сироты)

0
По вопросам рекламы [email protected]