2017-06-22 91 views
0

當我嘗試添加一個對象從我的實體'Facture'主義不更新對象'Dechet'。插入工作正常,但在我的表Dechet我沒有從我的對象(Facture)我的外鍵:Symfony:學說不更新ManyToOne

    if($dechetVert>$CorrecteurDechetVert || $Encombrants>$CorrecteurEncombrants || $Bois>$CorrecteurBois || 
        $Brique>$CorrecteurBrique || $Terre>$CorrecteurTerre) { 
        $time = new \DateTime('now'); 
        $Facture = new Facture(); 
        $Facture->setDate($time); 
        $Facture->setStatut('Impayé'); 
        $repository = $em->getRepository('Bundles\UserBundle\Entity\User'); 
        $menage = $repository->findOneById($UserId); 
        $repository = $em->getRepository('Bundles\MainBundle\Entity\TypeDechet'); 
        $type =$repository->findBy(array('Nom'=>$Type)); 
        $repository = $em->getRepository('Bundles\MainBundle\Entity\Dechet'); 
        $DechetsSelectionne = $repository->getDechetByMenageAndType($menage,$type); 
        $Facture->setUtilisateur($menage); 
        $Facture->setDechets($DechetsSelectionne); 

        $em->persist($Facture); 
        $em->flush(); 
        $em->clear(); 

Entity Dechet : 

    <?php 

namespace Bundles\MainBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Sensio\Bundle\GeneratorBundle\Model\Bundle; 
use Bundles\MainBundle\Entity; 


/** 
* Dechet 
* 
* @ORM\Table(name="dechet") 
* @ORM\Entity(repositoryClass="Bundles\MainBundle\Entity\DechetRepository") 
*/ 
class Dechet 
{ 
    /** 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** 
    * @ORM\Column(name="volume", type="float", precision=4, scale=1) 
    */ 
    private $Volume; 
    /** 
    * @ORM\Column(name="datedepot", type="date") 
    */ 
    private $dateDepot; 
    /** 
    * @ORM\ManyToOne(
    * targetEntity="Bundles\UserBundle\Entity\user", 
    * inversedBy="Dechets", 
    *) 
    */ 
    private $Menage; 
    /** 
    * @ORM\ManyToOne(
    * targetEntity="Bundles\MainBundle\Entity\Conteneur", 
    * inversedBy="Dechets" 
    *) 
    */ 
    private $Conteneur; 
    /** 
    * @ORM\ManyToOne(
    * targetEntity="Bundles\MainBundle\Entity\TypeDechet", 
    * inversedBy="Dechets" 
    *) 
    */ 
    private $Type; 
    /** 
    * @ORM\ManyToOne(
    * targetEntity="Bundles\MainBundle\Entity\Facture", 
    * inversedBy="Dechets", 
    *) 
    */ 
    private $Facture; 


    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * @return string 
    */ 
    public function getVolume(){ 
     return $this->Volume; 
    } 

    public function setVolume ($Volume){ 
     $this->Volume = $Volume; 
     return $this; 
    } 
    /** 
    * @return \DateTime 
    */ 
    public function getDate(){ 
     return $this->dateDepot; 
    } 

    public function setDate ($dateDepot){ 
     $this->dateDepot = $dateDepot; 
     return $this; 
    } 
    /** 
    * Get Menage 
    * @return \Bundles\UserBundle\Entity\user 
    */ 
    public function getMenage(){ 
     return $this->Menage; 
    } 

    public function setMenage ($Menage){ 
     $this->Menage = $Menage; 
     return $this; 
    } 
    /** 
    * Get Conteneur 
    * @return \Bundles\MainBundle\Entity\Conteneur 
    */ 
    public function getConteneur(){ 
     return $this->Conteneur; 
    } 


    public function setConteneur ($Conteneur){ 
     $this->Conteneur = $Conteneur; 
     return $this; 
    } 
    /** 
    * Get Type 
    * @return \Bundles\MainBundle\Entity\TypeDechet 
    */ 
    public function getType(){ 
     return $this->Type; 
    } 

    public function setType ($Type){ 
     $this->Type = $Type; 
     return $this; 
    } 

    /** 
    * Get Facture 
    * @return \Bundles\MainBundle\Entity\Facture 
    */ 
    public function getFacture(){ 
     return $this->Facture; 
    } 

    public function setFacture ($Facture){ 
     $this->Facture = $Facture; 
     return $this; 
    } 

} 

Entity Facture : 

<?php 

namespace Bundles\MainBundle\Entity; 

use Doctrine\DBAL\Types\IntegerType; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* Facture 
* 
* @ORM\Table(name="facture") 
* @ORM\Entity() 
*/ 
class Facture 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** 
    * @ORM\ManyToOne(
    * targetEntity="Bundles\UserBundle\Entity\user", 
    * inversedBy="Factures" 
    *) 
    */ 
    private $Utilisateur; 
    /** 
    * @ORM\OneToMany(
    * targetEntity="Bundles\MainBundle\Entity\Dechet", 
    * mappedBy="Facture", 
    * cascade={"all"} 
    *) 
    */ 
    private $Dechets; 
    /** 
    * @ORM\Column(type="string") 
    */ 
    private $Statut; 



    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * @ORM\Column(name="Date", type="date") 
    */ 
    private $Date; 

    /** 
    * Get Utilisateur 
    * @return \Bundles\UserBundle\Entity\user 
    */ 
    public function getUtilisateur(){ 
     return $this->Utilisateur; 
    } 
    public function setUtilisateur($Utilisateur){ 
     $this->Utilisateur = $Utilisateur; 
     return $this; 
    } 

    public function getDechets(){ 
     return $this->Dechets; 
    } 

    public function setDechets($Dechets){ 
     $this->Dechets = $Dechets; 
     return $this; 
    } 

    public function getStatut(){ 
     return $this->Statut; 
    } 

    public function setStatut($Statut){ 
     $this->Statut = $Statut; 
     return $this; 
    } 
    /** 
    * @return \DateTime 
    */ 
    public function getDate(){ 
     return $this->Date; 
    } 

    public function setDate ($Date){ 
     $this->Date = $Date; 
     return $this; 
    } 
} 

感謝您的回覆!

回答

0

首先確認你getDechetByMenageAndType有一個結果,假設你在下面。

我看到的主要問題是您指定Facture::$DechetsOneToMany這意味着Dechets是對象的集合(多個)。

所以你需要改變以下內容。

namespace Bundles\MainBundle\Entity; 

use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\DBAL\Types\IntegerType; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* Facture 
* 
* @ORM\Table(name="facture") 
* @ORM\Entity() 
*/ 
class Facture 
{ 
    //... 
    /** 
    * @var ArrayCollection|\Bundles\MainBundle\Entity\Dechet[] 
    * @ORM\OneToMany(
    * targetEntity="Bundles\MainBundle\Entity\Dechet", 
    * mappedBy="Facture", 
    * cascade={"all"} 
    *) 
    */ 
    private $Dechets; 

    //... 

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

    /** 
    * @return ArrayCollection|\Bundles\MainBundle\Entity\Dechet[] 
    */ 
    public function getDechets() 
    { 
     return $this->Dechets; 
    } 

    /** 
    * @param \Bundles\MainBundle\Entity\Dechet $Dechets 
    */ 
    public function addDechet(\Bundles\MainBundle\Entity\Dechet $Dechets) 
    { 
     if (!$this->Dechets->contains($Dechets)) { 
      $Dechets->setFacture($this); //explicitly set the facture 
      $this->Dechets[] = $Dechets; 
     } 

     return $this; 
    } 

    /** 
    * @param \Bundles\MainBundle\Entity\Dechet $Dechets 
    */ 
    public function removeDechet(\Bundles\MainBundle\Entity\Dechet $Dechets) 
    { 
     if ($this->Dechets->contains($Dechets)) { 
      $Dechets->setFacture(null); //optional if Facture is nullable 
      $this->Dechets->removeElement($Dechets); 
     } 

     return $this; 
    } 
} 

然後在你的控制器改變$Facture->setDechets($DechetsSelectionne);

$Facture->addDechet($DechetsSelectionne);

如果您提交收集與getDechetByMenageAndType,你將需要申請的骨折。

所以,你可以做

foreach($DechetsSelectionne as $Dechet) { 
    $Facture->addDechet($Dechet); 
} 

下,如果在dechet數據庫表中的關聯字段是不是Facture_id你需要用JOIN column定義擁有方列。假設列名Facture你可以使用:

namespace Bundles\MainBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 


/** 
* Dechet 
* 
* @ORM\Table(name="dechet") 
* @ORM\Entity(repositoryClass="Bundles\MainBundle\Entity\DechetRepository") 
*/ 
class Dechet 
{ 
    //... 

    /** 
    * @ORM\ManyToOne(
    * targetEntity="Bundles\MainBundle\Entity\Facture", 
    * inversedBy="Dechets", 
    *) 
    * @ORM\JoinColumn(name="Facture", referencedColumnName="id", nullable=true) 
    */ 
    private $Facture; 

} 

進行更改後,一定要清除緩存

php bin/console cache:clear --no-warmup 
php bin/console cache:warmup 
+0

getDechetByMenageAndType Works我嘗試過。我有這個例外:嘗試從命名空間「Bundles \ MainBundle \ Entity」加載類「ArrayCollection」。 您忘記了「Doctrine \ Common \ Collections \ ArrayCollection」的「使用」語句嗎? –

+0

您必須在我的示例中添加'使用Doctrine \ Common \ Collections \ ArrayCollection'到您的'Facture'實體的頂部。 – fyrye

+0

感謝您的回覆,我添加了它,但現在出現此錯誤: –

0

我想你忘記添加

$dechetSelectionne->addFacture($Facture) 

在實體另外補充:

/** 
* @ORM\ManyToOne(
* targetEntity="Bundles\MainBundle\Entity\Facture", 
* inversedBy="Dechets", cascade={"persist"} 
*) 
*/ 
private $Facture; 
+0

當我做到這一點,我有: –

+0

一個新的實體是通過關係找到'Bundles \ MainBundle \ Entity \ Dechet#Menage'未配置爲級聯實體:scadra-08的持久化操作。要解決這個問題:顯式調用EntityManager#persist()這個未知的實體或配置級聯在映射中堅持這個關聯,例如@ManyToOne(..,cascade = {「persist」}) –

+0

你必須在齊平。如果仍然無效嘗試(仍然在刷新後)'$ Facture-> getId();' –