原则 2 ArrayCollection::add() 以相反的顺序持久化项目



在独立实体上调用persist()flush()之前,我正在对$this->myDependentEntityCollection[] = $myDependentEntity;进行多次调用(这是一种ArrayCollectionPersistentCollection(使用 cascade=persist(。

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

以下示例为具有1:N关系的OrderItem

// 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.

如何使它们以正确的顺序保存?

尝试使用 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);
}

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

相关内容

  • 没有找到相关文章

最新更新