Хотя Doctrine проверяет сторону ассоциации на наличие вещей, которые необходимо сохранить, всегда важно синхронизировать обе стороны ассоциации.
Мой совет - иметь, добавлять и удалять (не задано) методы с обеих сторон, которые выглядят так:
class Slaplans
{
public function getHolidays()
{
return $this->holidays->toArray();
}
public function addHoliday(Slaholiday $holiday)
{
if (!$this->holidays->contains($holiday)) {
$this->holidays->add($holiday);
$holiday->addPlan($this);
}
return $this;
}
public function removeHoliday(Slaholiday $holiday)
{
if ($this->holidays->contains($holiday)) {
$this->holidays->removeElement($holiday);
$holiday->removePlan($this);
}
return $this;
}
}
Сделайте то же самое в Slaplan
.
Теперь, когда вы добавляете Slaholiday в Slaplan, этот Slaplan также будетбыть добавленным в Slaholiday автоматически.То же самое касается удаления.
Так что теперь вы можете сделать что-то вроде этого:
$plan = $em->find('Slaplan', 1);
$holiday = new Slaholiday();
// set data on $holiday
// no need to persist $holiday, because you have a cascade={"ALL"} all on the association
$plan->addHoliday($holiday);
// no need to persist $plan, because it's managed by the entitymanager (unless you don't use change tracking policy "DEFERRED_IMPLICIT" (which is used by default))
$em->flush();
PS: не используйте cascade
с обеих сторон ассоциации.Это сделает вещи медленнее, чем необходимо, а в некоторых случаях может привести к ошибкам.Если вы сначала создадите Slaplan, а затем добавите к нему Slaholidays, сохраните cascade
в Slaplan и удалите его из Slaholiday.