Viraj Amarasinghe
Viraj Amarasinghe

Reputation: 941

Doctrine 2 persist only save header object why?

I want save purchase order header with purchase order details.This my PurchaseOrder Entity Class=>

 namespace AppBundle\Entity;

 use AppBundle\Entity\PurchaseInvoiceDetail;
 use Doctrine\Common\Collections\ArrayCollection;
 use Doctrine\ORM\Mapping as ORM;


/**
* PurchaseOrder
*
* @ORM\Table(name="purchase_order", indexes={@ORM\Index(name="fk_purchase_order_supplier1_idx", columns={"supplier_id"})})
* @ORM\Entity
*/
class PurchaseOrder
{
/**
 * @var PurchaseOrderDetails
 *
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\PurchaseOrderDetails", mappedBy="purchaseOrder",cascade={"cascade"})
 * @JMS\Type("ArrayCollection<FinanceBundle\Entity\AutoAllocation>")
 */
private $purchaseOrderDetails;


public function __construct()
{
    $this->purchaseOrderDetails = new ArrayCollection();
}

public function addPurchaseOrderDetail(PurchaseOrderDetails $purchaseOrderDetails)
{
    $this->purchaseOrderDetails->add($purchaseOrderDetails);
}

/**
 * @return PurchaseOrderDetails
 */
public function getPurchaseOrderDetails()
{
    return $this->purchaseOrderDetails;
}

/**
 * @param PurchaseOrderDetails $purchaseOrderDetails
 */
public function setPurchaseOrderDetails($purchaseOrderDetails)
{
    $this->purchaseOrderDetails = $purchaseOrderDetails;
}

}

and PurchaseOrderDetail class as this =>

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* PurchaseOrderDetails
*
* @ORM\Table(name="purchase_order_details", indexes={@ORM\Index(name="fk_purchase_order_details_purchase_order1_idx", columns={"purchase_order_id"}),    @ORM\Index(name="fk_purchase_order_details_invt_item1_idx", columns={"id_item"})})
  * @ORM\Entity
  */
class PurchaseOrderDetails
{


/**
 * @var \AppBundle\Entity\PurchaseOrder
 *
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\PurchaseOrder",inversedBy="purchaseOrderDetails")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="purchase_order_id", referencedColumnName="id")
 * })
 */
private $purchaseOrder;
/**
 * Set purchaseOrder
 *
 * @param \AppBundle\Entity\PurchaseOrder $purchaseOrder
 *
 * @return PurchaseOrderDetails
 */
public function setPurchaseOrder(\AppBundle\Entity\PurchaseOrder $purchaseOrder = null)
{
    $this->purchaseOrder = $purchaseOrder;

    return $this;
}

/**
 * Get purchaseOrder
 *
 * @return \AppBundle\Entity\PurchaseOrder
 */
public function getPurchaseOrder()
{
    return $this->purchaseOrder;
}
}

my php code in symfony 3.1 as follows=>

$em = $this->getDoctrine()->getManager();
$purchaseOrder = new PurchaseOrder();
$puchaseOrderDetail = new PurchaseOrderDetails();
$puchaseOrderDetail->setPrice(100);
$purchaseOrder->setPurchaseOrderDetails($puchaseOrderDetail);
$puchaseOrderDetail->setPurchaseOrder($purchaseOrder);
$em->persist($purchaseOrder);
$em->flush();

no errors occurred and just only purchase order have persisted and purchase order detail doesn't

Upvotes: 1

Views: 120

Answers (2)

Finwe
Finwe

Reputation: 6745

You are not persisting the detail object. Either persist it manually with

$em->persist($purchaseOrderDetail);

or fix

cascade={"persist"}

in the @ORM\OneToMany annotation of PurchaseOrder::$purchaseOrderDetails (cascade={"cascade"} is probably a typo).

Upvotes: 2

Jeet
Jeet

Reputation: 1587

You need to persist PurchaseOrderDetails as well.

The below code should save both of your entities.

$em = $this->getDoctrine()->getManager();
$purchaseOrder = new PurchaseOrder();
$puchaseOrderDetail = new PurchaseOrderDetails();
$puchaseOrderDetail->setPrice(100);
$purchaseOrder->setPurchaseOrderDetails($puchaseOrderDetail);
$puchaseOrderDetail->setPurchaseOrder($purchaseOrder);
$em->persist($purchaseOrder);
$em->persist($puchaseOrderDetail);
$em->flush();

As @Finwe has mentioned, If your business logic requires, and you don't want to persist separately PurchaseOrderDetails entity while creating a new PurchaseOrder. You might consider configuring cascade_persist. which will persist automatically associated entity.

To do so, add cascade option to your association config :

@ORM\OneToMany(targetEntity="AppBundle\Entity\PurchaseOrderDetails", mappedBy="purchaseOrder",cascade={"persist"})

Upvotes: 1

Related Questions