@bears

Как получить удаленные из коллекции сущности Doctrine?

Друзья, появилась необходимость отслеживать какие сущности были удалены из связанной коллекции 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()); // тут есть добавленный элемент
  • Вопрос задан
  • 206 просмотров
Решения вопроса 1
@Flying
Ответы на ваши вопросы, очевидно, кроются в исходниках Doctrine:
Видно что поведение метода clear() зависит от того какую из сторон ассоциации вы очищаете. Также видно что если вы работаете с owner side ассоциации - то Doctrine создаёт новый snapshot.

Из кода методов getInsertDiff и getDeleteDiff видно что вычисление разницы происходит через сравнение snapshot'а с текущим содержимым коллекци, так что очевидно что в случае создания нового snapshot'а разница будет пустым массивом.

Проверить, вызывает ли сама Symfony метод clear() проще всего, поставив там точку останова.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы