2015-03-04 2 views
2

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

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

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

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

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

В то время как доктрина и 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; 
} 
+0

Следует отметить, что удаление свойства $ background и аннотации отношений ManyToOne прекрасно восстанавливает функциональность удаления каскада при удалении страницы (удаление ее пользовательских фонов) - но это, конечно, не то, что я хочу делать. – darkbluesun

+0

dariusphp успешно разрешил мою проблему, но для меня это не имеет никакого смысла. Я использую cascade = {"remove"} для удаления других связанных объектов при удалении, и я не использую 'onDelete =" SET NULL "для них. Я обнаружил, что 'onDelete =" SET NULL "' работает на уровне dbms для сирот связанных объектов, когда их родительский объект удален. Как это помогает доктрине удалять связанные объекты, когда их родитель удален? – darkbluesun

ответ

3

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

EDIT: Проблема находится на уровне базы данных не доктриной х, каскад = «удалить» заботится о том, что внешний ключ для PAGE_ID однако, остается, то OnDelete указывает на то, что если столбец с этой внешней связи удаляется, установите для поля значение «this» в этом случае его значение null. если вы --dump-SQL перед тем схеме update'ing вы увидите добавление запроса, то вдоль линий "ON DELETE SET *"

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

+0

Но разве это не просто сироту пользовательских фонов при удалении страницы? – darkbluesun

+0

Я пробовал это, и я просто получаю ту же ошибку: «Исключение произошло во время выполнения« УДАЛИТЬ ИЗ ПИСАНИЯ WHERE id =? » с параметрами [16]: SQLSTATE [23000]: Нарушение ограничения целостности: 1451 Не удается удалить или обновить родительскую строку: ограничение внешнего ключа завершается с ошибкой ('project'.'Background', CONSTRAINT' FK_F335B7807B40E4F7' FOREIGN KEY ('page_id') СПИСОК ЛИТЕРАТУРЫ' '' '' '' '' – darkbluesun

+0

Извините, я попробовал ваш ответ снова, и он действительно работает - и фон фактически удален - что не является Спасибо, @dariusphp! – darkbluesun

0

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

+0

Но я хочу, чтобы пользовательские фоны были удалены при удалении страницы, а значение background_id страницы было установлено равным null при удалении фона ... – darkbluesun

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

Должен сделать трюк (Doctrine - Orphan Removal)

Смежные вопросы