Symfony / doctrine 插入相关对象
Symfony / doctrine insert related objects
我有一个实体 "Order" 这个实体有一个 orderDetails 数组 (class: "OrderDetail")。
我想插入订单实体,包括订单的订单详情。除了 OrderDetail table 中的 "order_id" 字段保持 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;
您需要在 ManyToOne 关系上添加 JoinColumn 注释。见 docs for more details.
在 OrderDetail 实体中将代码更改为:
/**
* @ORM\ManyToOne(targetEntity="Order", inversedBy="orderDetails", cascade={"persist", "remove"})
* @JoinColumn(name="order_id", referencedColumnName="id")
**/
protected $order;
你的关系是正确的。问题出在控制器内部。
这 link 应该有帮助(保存相关实体)
http://symfony.com/doc/current/book/doctrine.html#saving-related-entities
顺便说一句,改用
$order = $form->getData()
使用
$order = $form->handleRequest($request)
如果您使用 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;
}
每次向订单添加 OrderDetail 时使用它。在持久化和刷新订单后,订单详细信息应该具有数据库中父订单的 ID。
这是由于拥有和反向学说的概念。 Doctrine 只会检查 associations
的拥有方
我有一个实体 "Order" 这个实体有一个 orderDetails 数组 (class: "OrderDetail")。
我想插入订单实体,包括订单的订单详情。除了 OrderDetail table 中的 "order_id" 字段保持 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;
您需要在 ManyToOne 关系上添加 JoinColumn 注释。见 docs for more details.
在 OrderDetail 实体中将代码更改为:
/**
* @ORM\ManyToOne(targetEntity="Order", inversedBy="orderDetails", cascade={"persist", "remove"})
* @JoinColumn(name="order_id", referencedColumnName="id")
**/
protected $order;
你的关系是正确的。问题出在控制器内部。
这 link 应该有帮助(保存相关实体)
http://symfony.com/doc/current/book/doctrine.html#saving-related-entities
顺便说一句,改用
$order = $form->getData()
使用
$order = $form->handleRequest($request)
如果您使用 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;
}
每次向订单添加 OrderDetail 时使用它。在持久化和刷新订单后,订单详细信息应该具有数据库中父订单的 ID。
这是由于拥有和反向学说的概念。 Doctrine 只会检查 associations
的拥有方