2016-09-23 2 views
1

Je veux sauver achat symfony pour en-tête avec ordre d'achat details.This mon PurchaseOrder Entité Class =>Doctrine 2 persiste seulement enregistrer objet en-tête pourquoi?

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; 
} 

} 
classe

et PurchaseOrderDetail comme cela =>

<?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; 
} 
} 

mon code php 3.1 comme suit = >

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

pas erreurs se sont produites et juste que l'achat de l'ordre ont persisté et l'achat détail de la commande ne pas

Répondre

1

Vous n'êtes pas persistant l'objet détail. Soit persister manuellement avec

$em->persist($purchaseOrderDetail); 

ou fixer

cascade={"persist"} 

dans l'annotation @ORM\OneToMany de PurchaseOrder::$purchaseOrderDetails (cascade={"cascade"} est probablement une faute de frappe).

+0

Je peux voir que je l'ai déjà fait ILe premier cadre de cette question dude.but ne fonctionne pas – Sameera

+0

code @Sameera vous avez fait ce mec ? Si vous voulez dire que la cascade persiste, vous avez tort (cascade = cascade vs cascade = persister) – Finwe

0

Vous devez persistPurchaseOrderDetails aussi bien.

Le code ci-dessous doit enregistrer vos deux entités.

$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(); 

Comme @Finwe a mentionné, si votre logique métier exige, et vous ne voulez pas persist séparément PurchaseOrderDetails entité tout en créant une nouvelle PurchaseOrder. Vous pouvez envisager de configurer cascade_persist. qui persistera automatiquement entité associée.

Pour ce faire, ajoutez l'option cascade à votre config d'association:

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

Je peux voir que je l'ai déjà fait le premier code de cette question mec.but ne fonctionne pas – Sameera

+0

Vous avez fait comme 'cascade = { "cascade"} '. Je suppose que vous devriez avoir 'cascade = {" persist "}' pour cascader de nouvelles données dans l'enfant comme cela arrive dans le parent. Vous pouvez avoir 'cascade = {" all "}' pour gérer tout (insérer, mettre à jour et supprimer). S'il vous plaît jeter un oeil et voir si cela fonctionne! – Jeet