Symfony:Doctrine不会更新ManyToOne



当我尝试从我的实体"Facture"学说中添加对象时,不会更新对象"Dechet"。插入工作正常,但在我的表中 Dechet 我没有来自我的对象(Facture(的外键:

                    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('BundlesUserBundleEntityUser');
                    $menage = $repository->findOneById($UserId);
                    $repository = $em->getRepository('BundlesMainBundleEntityTypeDechet');
                    $type =$repository->findBy(array('Nom'=>$Type));
                    $repository = $em->getRepository('BundlesMainBundleEntityDechet');
                    $DechetsSelectionne = $repository->getDechetByMenageAndType($menage,$type);
                    $Facture->setUtilisateur($menage);
                    $Facture->setDechets($DechetsSelectionne);
                    $em->persist($Facture);
                    $em->flush();
                    $em->clear();
Entity Dechet :
    <?php
namespace BundlesMainBundleEntity;
use DoctrineORMMapping as ORM;
use SensioBundleGeneratorBundleModelBundle;
use BundlesMainBundleEntity;

/**
 * Dechet
 *
 * @ORMTable(name="dechet")
 * @ORMEntity(repositoryClass="BundlesMainBundleEntityDechetRepository")
 */
class Dechet
{
    /**
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORMColumn(name="volume", type="float", precision=4, scale=1)
     */
    private $Volume;
    /**
     * @ORMColumn(name="datedepot", type="date")
     */
    private $dateDepot;
    /**
     * @ORMManyToOne(
     * targetEntity="BundlesUserBundleEntityuser",
     * inversedBy="Dechets",
     * )
     */
    private $Menage;
    /**
     * @ORMManyToOne(
     * targetEntity="BundlesMainBundleEntityConteneur",
     * inversedBy="Dechets"
     * )
     */
    private $Conteneur;
    /**
     * @ORMManyToOne(
     * targetEntity="BundlesMainBundleEntityTypeDechet",
     * inversedBy="Dechets"
     * )
     */
    private $Type;
    /**
     * @ORMManyToOne(
     * targetEntity="BundlesMainBundleEntityFacture",
     * 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 BundlesUserBundleEntityuser
     */
    public function getMenage(){
        return $this->Menage;
    }
    public function setMenage ($Menage){
        $this->Menage = $Menage;
        return $this;
    }
    /**
     * Get Conteneur
     * @return BundlesMainBundleEntityConteneur
     */
    public function getConteneur(){
        return $this->Conteneur;
    }

    public function setConteneur ($Conteneur){
        $this->Conteneur = $Conteneur;
        return $this;
    }
    /**
     * Get Type
     * @return BundlesMainBundleEntityTypeDechet
     */
    public function getType(){
        return $this->Type;
    }
    public function setType ($Type){
        $this->Type = $Type;
        return $this;
    }
    /**
     * Get Facture
     * @return BundlesMainBundleEntityFacture
     */
    public function getFacture(){
        return $this->Facture;
    }
    public function setFacture ($Facture){
        $this->Facture = $Facture;
        return $this;
    }
}
Entity Facture :
<?php
namespace BundlesMainBundleEntity;
use DoctrineDBALTypesIntegerType;
use DoctrineORMMapping as ORM;
/**
 * Facture
 *
 * @ORMTable(name="facture")
 * @ORMEntity()
 */
class Facture
{
    /**
     * @var int
     *
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORMManyToOne(
     * targetEntity="BundlesUserBundleEntityuser",
     * inversedBy="Factures"
     * )
     */
    private $Utilisateur;
    /**
     * @ORMOneToMany(
     * targetEntity="BundlesMainBundleEntityDechet",
     * mappedBy="Facture",
     * cascade={"all"}
     * )
     */
    private $Dechets;
    /**
     * @ORMColumn(type="string")
     */
    private $Statut;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * @ORMColumn(name="Date", type="date")
     */
    private $Date;
    /**
     * Get Utilisateur
     * @return BundlesUserBundleEntityuser
     */
    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;
    }
}

感谢您的回复!

首先验证你有来自getDechetByMenageAndType的结果,假设你在下面。

我看到的主要问题是您将Facture::$Dechets指定为 OneToMany这意味着Dechets是对象的集合(多个(。

因此,您需要更改以下内容。

namespace BundlesMainBundleEntity;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineDBALTypesIntegerType;
use DoctrineORMMapping as ORM;
/**
 * Facture
 *
 * @ORMTable(name="facture")
 * @ORMEntity()
 */
class Facture
{
   //...
    /**
     * @var ArrayCollection|BundlesMainBundleEntityDechet[]
     * @ORMOneToMany(
     * targetEntity="BundlesMainBundleEntityDechet",
     * mappedBy="Facture",
     * cascade={"all"}
     * )
     */
    private $Dechets;
    //...
    public function __construct()
    {
        $this->Dechets = new ArrayCollection();
    }
    /**
     * @return ArrayCollection|BundlesMainBundleEntityDechet[]
     */
    public function getDechets()
    {
        return $this->Dechets;
    }
    /**
     * @param BundlesMainBundleEntityDechet $Dechets
     */
    public function addDechet(BundlesMainBundleEntityDechet $Dechets)
    {
        if (!$this->Dechets->contains($Dechets)) {
            $Dechets->setFacture($this); //explicitly set the facture
            $this->Dechets[] = $Dechets;
        }
        return $this;
    }
    /**
     * @param BundlesMainBundleEntityDechet $Dechets
     */
    public function removeDechet(BundlesMainBundleEntityDechet $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的集合,则需要应用Facture。

所以你可以做到

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

接下来,如果dechet数据库表中的关联列未Facture_id则需要使用 JOIN column 定义拥有侧列。假设列名Facture您将使用:

namespace BundlesMainBundleEntity;
use DoctrineORMMapping as ORM;

/**
 * Dechet
 *
 * @ORMTable(name="dechet")
 * @ORMEntity(repositoryClass="BundlesMainBundleEntityDechetRepository")
 */
class Dechet
{
    //...
    /**
     * @ORMManyToOne(
     * targetEntity="BundlesMainBundleEntityFacture",
     * inversedBy="Dechets",
     * )
     * @ORMJoinColumn(name="Facture", referencedColumnName="id", nullable=true)
     */
    private $Facture;
}

进行更改后,请务必清除缓存

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

我想你忘了添加

$dechetSelectionne->addFacture($Facture)

同时添加您的实体:

/**
 * @ORMManyToOne(
 * targetEntity="BundlesMainBundleEntityFacture",
 * inversedBy="Dechets", cascade={"persist"}
 * )
 */
private $Facture;

最新更新