Безопасно ли удалять элементы из коллекции Doctrine при переборе ее в цикле foreach?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Безопасно ли удалять элементы из коллекции Doctrine при переборе ее в цикле foreach?

Сообщение Anonymous »

Я работаю с Doctrine ORM и часто вижу рекомендации вызвать toArray() для коллекции перед перебором ее при удалении элементов.
Мне хотелось бы понять, действительно ли это необходимо и почему.
Контекст
У меня есть сущность Досье с отношением OneToMany к Echeance:

Код: Выделить всё

#[ORM\OneToMany(mappedBy: 'dossier', targetEntity: Echeance::class, orphanRemoval: true)]
private Collection $echeances;
Я хочу удалить все объекты Echeance, у которых нет активного правила.
Код без toArray()

Код: Выделить всё

foreach ($dossier->getEcheances() as $echeance) {
if (!$this->hasActiveReglement($echeance)) {
$dossier->removeEcheance($echeance);
}
}
Я видел совет, что этот шаблон может быть небезопасным, поскольку коллекция изменяется во время итерации.
Альтернативная версия с toArray()

Код: Выделить всё

foreach ($dossier->getEcheances()->toArray() as $echeance) {
if (!$this->hasActiveReglement($echeance)) {
$dossier->removeEcheance($echeance);
}
}
Вопросы:
  • Действительно ли небезопасно удалять элементы из коллекции Doctrine во время итерации по ней?
  • Можно ли действительно пропускать элементы в этой ситуации или это просто мера предосторожности?
  • Такое поведение исходит из самого PHP foreach или из-за Реализация PersistentCollection в Doctrine?
  • Является ли использование toArray() рекомендуемой лучшей практикой в этом случае?
Я хотел бы понять, что происходит внутри в этом случае.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ng-over-it
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»