我被一个看起来非常令人费解的问题所困扰。仅供参考 - 我知道并且我已经阅读了大部分的学说问题,因此我了解了学说的基本知识并指定了关系。
以下是我的数据模型的外观(发布相关的代码部分)
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 One-To-Many Relationship Won't Save - Integrity Constraint Violation 许多关系,不会保存完整性约束违章 Symfony 2 doctrine persist doesn't work after updating Relationship Mapping Doctrine entities relationship
在完成此Doctrine "A new entity was found through the relationship" error之后,我尝试在持久化示例之前保留$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
答案 0 :(得分:5)
我认为您应该在设置analysis
之前将Analyses
添加到Sample
集合。
我猜$ this->分析是一个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;
}
}
答案 1 :(得分:0)
... Credreak 谢谢你......教义不清楚这些是如何构建的。
我实际上修改了您的代码以创建“相关字段”(analyese)的实例作为Array Collection @ _construct,然后您可以通过将该数组传递给addAnalysis()函数来填充该实际实体。
所以操作的顺序是:(据我所知)
这对我有用。
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; } }