2016-06-02 2 views
1

У меня есть сущность, «AnnualReport», которая принимает коллекцию сущностей «AnnualReportStaffing». В годовом отчете есть четыре разных раздела «Укомплектование персоналом» и, следовательно, четыре из этих коллекций (ArrayCollection). Поскольку я не могу использовать традиционные отношения «один-ко-многим», мне нужно использовать «Один-ко-многим» с таблицей Join, как описано here.Symfony2 и доктрина: один-ко-многим с присоединением к столовой сиротской помощи

Так, например, одна из моих коллекций Кадровых определяются как таковы в моей ГО классе:

/** 
* @ORM\ManyToMany(targetEntity="AnnualReportStaffing", cascade={"persist"}, orphanRemoval=true, fetch="LAZY") 
* @ORM\JoinTable(name="annualreports_staffingtenure", 
*  joinColumns={@ORM\JoinColumn(name="staffing_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="annualreport_id", referencedColumnName="id")}, 
*  ) 
*/ 
private $staffing; 

Теперь, когда приходит время, чтобы удалить ГО, Doctrine удаляет связь между отчетом и кадровым обеспечением внутри таблицы соединений, но НЕ удаляет связанные объекты YearReportStaffing. Я попробовал добавить cascade = {"remove"}, но я получаю нарушение внешнего ключа, потому что он пытается удалить объект укомплектования, прежде чем объединение таблицы соединений будет удалено.

Каков наилучший способ удалить осиротевшие объекты укомплектования персоналом? Очевидно, orphanRemoval = true не ответ.

ответ

0

Вы можете попробовать так:

@ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE") 
+0

Это необходимо для столбца отчета, но не имеет значения для удаления сиротских сотрудников. – Ravioli87

1

Решение состоит в том, что вы должны сначала отделить объект от ВЭД ОРМ, так что больше не отслеживаются. После отсоединения его можно удалить без нарушения внешнего ключа. Кроме того, обратный столбец должен был иметь onDelete = «CASCADE», установленный для удаления самого отчета. Я не уверен, что это самое безопасное или изящное решение, но, похоже, оно работает в этом конкретном случае использования.

/** 
* @ORM\ManyToMany(targetEntity="AnnualReportStaffing", cascade={"persist", "detach", "remove"}, orphanRemoval=true, fetch="LAZY") 
* @ORM\JoinTable(name="annualreports_staffingtenure", 
*  joinColumns={@ORM\JoinColumn(name="annualreport_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="staffing_id", referencedColumnName="id", onDelete="CASCADE")}, 
*  ) 
*/ 

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

  • Нет связанных вопросов^_^