【发布时间】:2019-02-09 16:22:22
【问题描述】:
我知道实体中的关联属性是实现\Doctrine\Common\Collections\Collection。我知道在构造函数中应该初始化这样的属性:
$this->collection = new \Doctrine\Common\Collections\ArrayCollection()
我知道我可以使用ArrayCollection#add() 和ArrayCollection#remove() 修改集合。但是我有不同的情况。
假设我有一个新的简单关联实体数组。使用现有方法我需要检查数组中的每个元素:如果实体集合有它。如果否 - 将数组元素添加到实体集合。除此之外,我需要检查实体集合中的每个元素。如果新数组中没有任何集合元素,那么我需要将其从集合中删除。琐碎的事情要做这么多工作。
我想要什么?要实现setProducts 方法:
class Entity {
private $products;
// ... constructor
public function setProducts(array $products)
{
// synchronize $products with $this->products
}
}
我试过了:$this->products = new ArrayCollection($products)。然而,这使得学说删除所有产品并从$products 参数中添加这些产品。我想要类似的结果,但没有数据库查询。
Doctrine 中是否有针对这种情况的内置解决方案?
编辑:
我想在ArrayCollection 中有一个方法,比如fromArray,它将合并集合中的元素,删除不需要的元素。这只会重复使用 add/remove 手动调用集合参数中的每个元素。
【问题讨论】:
-
您能否详细说明“我想要类似的结果但没有数据库查询”的意思?当您从列表中添加/删除元素时,Doctrine 不会执行(插入/删除/更新)查询。它将在后台记录更改,然后在您在 EntityManager 上调用
flush()时计算要执行的查询。如果查询性能是您关心的问题,您能否在问题中补充一下您对意外/缓慢查询有什么问题? -
@dbrumann 我的意思是,如果我使用
$this->products = new ArrayCollection($products)原则,请先删除所有产品,然后再插入。 -
@dbrumann 但是我刚刚注意到,您提出了一种无需查询即可执行此操作的方法。
-
当你说“简单的集合数组”时,你的意思是你有一个集合数组,每个集合都有一组元素吗?
-
@Oli 很抱歉混淆,没有注意到它是模棱两可的。我编辑了这个问题。我的意思是一个简单的关联实体数组。
ArrayCollection#toArray返回什么。