Doctrine 2 One-To-One однонаправленные отношения удаляют не владеющие стороны - PullRequest
8 голосов
/ 02 декабря 2011

У меня есть две сущности с однонаправленным отношением один к одному:

class Foo {
 ...
/**
 * @OneToOne(targetEntity="Bar")
 */
private $bar;
...
}

class Bar {
...
}

Когда я пытаюсь удалить сущность Bar, я получаю эту ошибку:

Ограничение целостностинарушение: 1451 Невозможно удалить или обновить родительскую строку: сбой ограничения внешнего ключа

Как сохранить однонаправленное отношение без потери возможности удаления сущностей Bar?

Ответы [ 3 ]

8 голосов
/ 12 сентября 2013

С Doctrine 2 это то, что вам нужно сделать:

class Foo {
   ...
  /**
   * @OneToOne(targetEntity="Bar")
   * @JoinColumn(name="bar_id", referencedColumnName="id", onDelete="CASCADE")
   */
  private $bar;
  ...
}

class Bar {
  ...
}

onDelete = "Cascade" будет делать то, что CappY сказал в своем ответе (установите свой внешний ключ на удаление каскада). Таким образом, при удалении вашей сущности Bar также будет удалена и связанная с ней сущность Foo.

Если вы предпочитаете не удалять свою сущность Foo, вы можете просто заменить onDelete = "Cascade" на onDelete = "SET NULL".

5 голосов
/ 13 августа 2014

Вы можете использовать Удаление сирот . Работает с one-to-one, one-to-many и many-to-many ассоциациями.

Вам нужно просто добавить параметр orphanRemoval=true следующим образом:

@OneToOne(targetEntity="Bar", orphanRemoval=true)

Надеюсь, это кому-нибудь поможет.

1 голос
/ 21 марта 2012

Установка внешнего ключа на УДАЛЕННЫЙ каскад (это также приведет к удалению записей Foo) или SET NULL (при установке столбца будет установлено значение NULL, когда вы удаляете Bar)

http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

...