我有一个实体"订单"这个实体有一个orderDetails数组(类:" OrderDetail")。
我想插入订单实体,包括订单下的订单详细信息。一切正常,除了" order_id" OrderDetail表中的字段保持为NULL。
插入代码:
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;
的OrderDetail实体
/**
* @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;
答案 0 :(得分:0)
您需要在ManyToOne关系上使用JoinColumn注释。请参阅docs for more details。
在OrderDetail实体中,将代码更改为:
/**
* @ORM\ManyToOne(targetEntity="Order", inversedBy="orderDetails", cascade={"persist", "remove"})
* @JoinColumn(name="order_id", referencedColumnName="id")
**/
protected $order;
答案 1 :(得分:0)
你的关系是正确的。问题在于控制器内部。
此链接应该有帮助(保存相关实体)
http://symfony.com/doc/current/book/doctrine.html#saving-related-entities
BTW改为使用
$order = $form->getData()
使用
$order = $form->handleRequest($request)
答案 2 :(得分:0)
如果您使用Symfony生成您的实体,您应该在Order实体中使用addOrderDetail
方法(或类似的方法)(如果没有,您可以自己创建)。在该方法中,您必须为要添加到订单的Order
特别设置OrderDetail
。
// Class Order
public function addOrderDetail(OrderDetail $orderDetail){
$this->orderDetails->add($orderDetail);
$orderDetail->setOrder($this);// Assign this order to $orderDetail object
return $this;
}
每次向订单添加OrderDetail时都使用它。在持续并刷新订单后,orderdetails应该具有DB中父订单的id。
这是由于拥有和反面的学说概念。 Doctrine只会检查associations
的拥有方