我在调用$this->myDependentEntityCollection[] = $myDependentEntity;
和ArrayCollection
之前拨打了PersistentCollection
(persist()
或flush()
。实体(使用cascade=persist
)。
然而,集合中的依赖实体以与他们添加的相反的顺序持久化(我猜测他们使用堆栈,然后逐个弹出项目)。
对Order
和Item
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();
它们会按照item3
,item2
,item1
的顺序保留;而不是1,2,3
。
我怎样才能让它们以正确的顺序保存?
答案 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数组的顺序上实现一个方法,并在持久化之前调用它,但更容易出错(您可能忘记调用该方法)。