Doctrine 2 ArrayCollection :: add()以相反的顺序保存项目

时间:2017-04-11 04:16:15

标签: doctrine-orm zend-framework2

我在调用$this->myDependentEntityCollection[] = $myDependentEntity;ArrayCollection之前拨打了PersistentCollectionpersist()flush()。实体(使用cascade=persist)。

然而,集合中的依赖实体以与他们添加的相反的顺序持久化(我猜测他们使用堆栈,然后逐个弹出项目)。

OrderItem 1:N关系采用以下示例:

// Order.php
/* (...doctrine stuff...,  cascade={"persist"}) */
protected $items;

public function addItem(Item $item) {
    $item->setOrder($this);
    $this->items[] = $item;
}

// Item.php
public function setOrder(Order $order) {
   $this->order = $order;
}

// Somewhere else in the code
$order->addItem($item1);
$order->addItem($item2);
$order->addItem($item3);

$em->persist($order);
$em->flush();

它们会按照item3item2item1的顺序保留;而不是1,2,3

我怎样才能让它们以正确的顺序保存?

1 个答案:

答案 0 :(得分:1)

尝试使用array_unshift

  

array_unshift - 将一个或多个元素添加到一个开头   阵列

例如:

public function addItem(Item $item) {
    $item->setOrder($this);
    array_unshift($this->items, $item);
}

希望这个帮助

注:

正如Christopher Francisco所说,无法将ArrayCollection对象传递给array_unshift函数,因此可以采用以下方法:

public function addItem(Item $item) {
    $item->setOrder($this);
    $itemsAsArray = $this->items->toArray();
    array_unshift($itemsAsArray, $item);
    $this->items = new ArrayCollection($itemsAsArray);
}

否则,您可以在inverse数组的顺序上实现一个方法,并在持久化之前调用它,但更容易出错(您可能忘记调用该方法)。