簡體   English   中英

學說不會拯救一對多的關系

[英]Doctrine won't save one-to-many relationship

我被一個看起來非常令人費解的問題所困擾。 僅供參考 - 我知道並且我已經閱讀了大部分的學說問題,因此我了解了學說的基礎知識並指定了關系。

以下是我的數據模型的外觀(發布代碼的相關部分)

class Sample
{

    /**
     * @ORM\OneToMany(targetEntity="Analysis", mappedBy="sample", cascade={"persist"})
     * 
     protected $analyses

     public function addAnalysis(Analysis $analysis)
     {
        $analyses->setSample($this);
        $this->analyses[] = $analyses;
     }
}

和分析

class Analysis
{

    /**
     * @ORM\ManyToOne(targetEntity="Sample", inverseBy="analyses", cascade={"persist"})
     * @ORM\JoinColumn(name="sample_id", referencedColumnName="id")
     * 
     protected $sample

     public function setSample(Sample $sample)
     {
        $this->sample = $sample;
     }
}

因此一個Sample可以有多個Analysis 雖然創建一個新的Analysis但它不是讓我創建一個。 它拋出一個NOT NULL約束異常。

以下是我試過的代碼。

$analysis = new Analysis
$analysis->setUUID("seeebbbfg");
$analysis->setStatus(Analysis::STATUS_DONE);
$sample = $sample->addAnalysis($analysis)
$em->persist($sample);
$em->flush();

我已經瀏覽了許多鏈接和學說文檔

Doctrine一對多關系不會保存 - 完整性約束違反多關系 - wont-save-integrity-constraint-violation Symfony 2 doctrine persist在更新關系映射 Doctrine實體關系 后不起作用

在經歷了這個學說“通過關系找到一個新實體”的錯誤之后 ,我試圖在持久化樣本之前堅持$analysis ,但它給出了“找到一個新實體”的錯誤然后這個官方的學說文檔http:// doctrine -orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/association-mapping.html

不知道我錯過了什么。 任何人都可以對此有所了解嗎?

更新1

[Doctrine\DBAL\Exception\NotNullConstraintViolationException]

An exception occurred while executing

INSERT INTO analysis (id, uuid, type, status, submission_at, sample_id) VALUES (?,?,?,?,?,?) with params [202066, "seeebbbfg", "temp", 2, "2016-5-22 12:16:39", null]
null value in column "sample_id" violates not-null constraint

我認為你應該在設置Sample之前將analysis添加到Analyses集合中。

我猜$ this-> analyze是一個ArrayCollection所以,使用ArrayCollection::add()方法添加一個新對象。

請嘗試這部分代碼,讓我知道結果

class Sample
{
    /**
     * @ORM\OneToMany(targetEntity="Analysis", mappedBy="sample", cascade={"persist"})
     */ 
     protected $analyses

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


     public function addAnalysis(Analysis $analysis)
     {
        $this->analyses->add($analysis); 
        $analysis->setSample($this);

        return $this;
     }
}

Credreak ...謝謝你......這個教義如何構建並不十分清楚。

我實際上修改了你的代碼以創建一個“相關字段”(analyese)的實例作為一個Array Collection @ _construct,然后你可以通過將它傳遞給addAnalysis()函數來填充該實際的Entity。

所以操作的順序是:(據我所知)

  • 使用“相關字段”(analyese)數組構建Sample的實例
  • 構造Analysis實例並填充Array
  • 將Analysis數組傳遞給Sample analyese Array
  • 然后刷新樣本,將Analysis數據保存到數據庫。

這對我有用。

class Sample
{
    /**
     * @ORM\OneToMany(targetEntity="Analysis", mappedBy="sample", cascade={"persist"})
     */  
protected $analyses

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


     public function addAnalysis(Analysis $analysis)
     {
        $this->analyses->add($analysis); 
        $analyses->setSample($this);

        return $this;
     }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM