Symfony / doctrine插入相关对象

时间:2015-01-15 16:10:15

标签: php symfony doctrine-orm

我有一个实体"订单"这个实体有一个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;

3 个答案:

答案 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

的拥有方