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

的拥有方