Doctrine 2.0 vs 2.1 каскад удалить OneToMany

Здравствуйте, у меня возникли проблемы при попытке каскадного удаления объектов в отношениях OneToMany. После нескольких часов отладки я попытался понизить доктрину с последней версии 2.1.2 до 2.0.2, и она неожиданно начинает работать.

Представьте два объекта Компания и Адрес в отношении 1: N.

/**
 * @Entity
 */
class Company extends Entity
{

 /**
  * @var integer
  * @id @Column(type="integer")
  * @generatedValue
  */
 private $id;

 /**
  * @var Collection
  * @OneToMany(targetEntity="Address",mappedBy="company", cascade={"persist","remove"})
  */
 private $addresses;
}



/**
 * @Entity
 */
class Address extends Entity
{

 /**
  * @var integer
  * @id @Column(type="integer")
  * @generatedValue
  */
 private $id;

 /**
  * @var Company
  * @ManyToOne(targetEntity="Company", inversedBy="addresses")
  * @JoinColumn(name="company_id", referencedColumnName="id",nullable=false)
  */
 private $company;
}

когда я пытаюсь удалить компанию Company, мне бы хотелось, чтобы назначенные адреса также были удалены.

$em->remove($company);
$em->flush();

В доктрине 2.1.2 удаление адресов не выполняется, поэтому ограничение целостности терпит неудачу. В версии 2.0.2 он работает отлично. Более странная вещь, если я использую расширение EntityAudit https://github.com/simplethings/EntityAudit, LogRevisionListener является корневым версией объектов адресов (установить их revtype = DEL) в доктрине 2.1.2 (из курс в 2.0.2), но UnitOfWork не удаляет его.

Есть ли разница в том, как обрабатывать каскадное удаление в версиях 2.0.2 и 2.1.2?

Большое спасибо

Ответ 1

Попробуйте использовать это в атрибуте addresses вашего Company класса

@OneToMany(targetEntity="Address",mappedBy="company", 
cascade={"persist"}, orphanRemoval=true)

Ответ 2

У меня была та же проблема... Отношения были добавлены или обновлены, но не удалены, даже если у меня был каскад: [persist, remove].

Я выяснил, что мне не нужен атрибут "remove" в "cascade", но мне пришлось добавить orphanRemoval: true.

Я сошел с ума, ты сделал мой день!

Ответ 3

Я столкнулся с той же проблемой, и я решил его с помощью этого кода:

$em->remove($object);
$em->flush();
$em->remove($user);
$em->flush();

Возможно, вы можете использовать findAll на своем company для адресов и удалить это с помощью foreach, как это:

// Return all the addresses of the company
$addresses = $em->getRepository(...)->findAllAddressesByCompany($company);
$em->remove($company);
foreach ($address in $addresses)
{
    $em->remove($address);
}

Это не очень хороший метод, но пока, что все, что я нашел.