Symfony/学说插入相关对象


Symfony / doctrine insert related objects

我有一个实体"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)