在独立实体上调用persist()
和flush()
之前,我正在对$this->myDependentEntityCollection[] = $myDependentEntity;
进行多次调用(这是一种ArrayCollection
或PersistentCollection
(使用 cascade=persist
(。
但是,集合中的依赖实体以与添加它们的顺序相反的顺序持久化(我猜他们使用堆栈,然后逐个弹出项目(。
以下示例为具有1:N
关系的Order
和Item
:
// 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();
它们按item3
、item2
、item1
的顺序持久化; 而不是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);
}
否则,您可以在对象上实现一个方法,该方法反转数组的顺序并在持久化之前调用它,但更容易出错(您可能忘记调用该方法(。