Друзья, появилась необходимость отслеживать какие сущности были удалены из связанной коллекции many-to-many, но тут наткнулся на странный баг (может фича?).
Дано: есть 2 сущности - User и Car. Между ними обычная связь many-to-many. Если сделать так:
// echo $user->getCars()->count(); = 1
$car = $user->getCars()->get(0);
$user->removeCar($car);
var_dump($user->getCars()->getDeleteDiff()); // тут есть удаленный элемент
то все работает прекрасно. Но если сделать так:
// echo $user->getCars()->count(); = 1
$car = $user->getCars()->get(0);
$user->getCars()->clear();
$user->addCar($car);
$user->removeCar($car);
var_dump($user->getCars()->getDeleteDiff()); // пустой массив
то нет. Опытным путем выявил, что после вызова
$user->getCars()->clear();
доктрина уже не может понять какие сущности удалены из коллекции. Так же, как показано в коде выше, после ->clear() можно добавить другие сущности в коллекцию и удалить, но все равно результат один - пустой массив. Если кто-то сталкивался, направьте пожалуйста, в какую сторону копать.
Проблема усугубляется тем, что проект рабочий, и эти сущности редактируются через стандартные формы symfony. Вот если удалить все связанные сущности, то видимо symfony вызывает тот самый clear().
P.S. удивляет то, что getInsertDiff работает всегда как надо, а вот getDeleteDiff нет.
$car = $user->getCars()->get(0);
$user->getCars()->clear();
$user->addCar($car);
var_dump($user->getCars()->getInsertDiff()); // тут есть добавленный элемент