我有一个实体"Order"这个实体有一个orderDetails数组(类:"OrderDetail")。
我想插入订单实体,包括订单中的订单详细信息。一切正常,除了订单明细表中的"order_id"字段保持为空。
插入代码:
if ($form->isValid()) {
$order = $form->getData();
$this->om->persist($order);
$this->om->flush($order);
return $order;
}
转储$order
object(Jds'ApiBundle'Entity'Order)[439]
protected 'id' => null
protected 'orderDate' =>
object(DateTime)[611]
public 'date' => string '2015-01-15 13:42:00' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'Europe/Paris' (length=12)
protected 'orderDetails' =>
object(Doctrine'Common'Collections'ArrayCollection)[440]
private '_elements' =>
array (size=2)
0 =>
object(Jds'ApiBundle'Entity'OrderDetail)[667]
protected 'id' => null
protected 'product' =>
object(Jds'ApiBundle'Entity'Product)[736]
...
protected 'price' => float 1
protected 'amount' => int 2
protected 'order' => null
1 =>
object(Jds'ApiBundle'Entity'OrderDetail)[702]
protected 'id' => null
protected 'product' =>
object(Jds'ApiBundle'Entity'Product)[749]
...
protected 'price' => float 1
protected 'amount' => int 5
protected 'order' => null
订单实体:
/**
* @ORM'Column(type="datetime", nullable=false)
* @Serializer'Groups({"orderList"})
*/
protected $orderDate;
//protected $orderedBy;
//protected $handledBy;
/**
* @ORM'OneToMany(targetEntity="OrderDetail", mappedBy="order", cascade={"persist", "remove"})
* @Serializer'Groups({"orderList"})
**/
protected $orderDetails;
订单详细信息实体
/**
* @ORM'ManyToOne(targetEntity="Product")
* @Serializer'Groups({"orderList"})
*/
protected $product;
/**
* @ORM'Column(type="decimal", precision=4, scale=2)
*/
protected $price;
/**
* @ORM'Column(type="integer", length=2)
* @Serializer'Groups({"orderList"})
*/
protected $amount;
/**
* @ORM'ManyToOne(targetEntity="Order", inversedBy="orderDetails", cascade={"persist", "remove"})
* @ORM'JoinColumn(name="order_id", referencedColumnName="id", nullable=false)
**/
protected $order;
如果你使用Symfony生成了你的实体,你应该在你的Order实体中有一个addOrderDetail
方法(或类似的东西)(如果没有,你可以自己创建它)。在该方法中,您必须专门为要添加到订单中的OrderDetail
设置Order
。
// Class Order
public function addOrderDetail(OrderDetail $orderDetail){
$this->orderDetails->add($orderDetail);
$orderDetail->setOrder($this);// Assign this order to $orderDetail object
return $this;
}
每次向订单添加订单详细信息时都使用它。订单保留并刷新后,订单详细信息应具有数据库中父订单的 ID。
这是由于拥有和反向方学说的概念。教义只会检查协会的拥有方
您需要在 ManyToOne 关系上具有 JoinColumn 注释。 有关更多详细信息,请参阅文档。
在"订单详细信息"实体中,将代码更改为:
/**
* @ORM'ManyToOne(targetEntity="Order", inversedBy="orderDetails", cascade={"persist", "remove"})
* @JoinColumn(name="order_id", referencedColumnName="id")
**/
protected $order;
你的关系是正确的。控制器内部出现问题。
此链接应该有帮助(保存相关实体)
http://symfony.com/doc/current/book/doctrine.html#saving-related-entities
顺便说一句,改用
$order = $form->getData()
用
$order = $form->handleRequest($request)