![](/img/trans.png)
[英]Doctrine One-To-Many Relationship Won't Save - Integrity Constraint Violation
[英]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。
所以操作的順序是:(據我所知)
這對我有用。
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.