Коллекции Doctrine не имеют функции «слияния», которая будет добавлять / удалять сущности из массива или Collection в другой коллекции.
Если вы хотите «упростить» процесс ручного слияния, который вы описываете, используя add / remove, вы можете использовать array_merge
, предполагая, что оба массива не являются числовыми, но вместо этого имеют какой-то уникальный ключ, например, сущность spl_object_hash
:
public function setProducts(array $products)
{
$this->products = new ArrayCollection(
array_merge(
array_combine(
array_map('spl_object_hash', $this->products->toArray()),
$this->products->toArray()
),
array_combine(
array_map('spl_object_hash', $products),
$products->toArray()
)
)
);
}
Возможно, вы захотите использовать идентификатор продукта вместо spl_object_hash
как 2 продукта с одинаковым идентификатором, но созданные как отдельные объекты - например, от одного до findBy()
в Doctrine и один вручнуюсозданный с помощью new Product()
- будет распознан как 2 разных продукта и может вызвать еще одну попытку вставки.
Поскольку вы заменяете исходную коллекцию PersistentCollection, содержащую ранее выбранные продукты, новой ArrayCollection, это все равно может привести к ненужным запросам илиОднако при очистке EntityManager можно получить неожиданные результаты.Не говоря уже о том, что этот подход может быть сложнее для чтения, чем явный вызов addElement / removeElement вместо исходной коллекции.