学说不会拯救一对多的关系

时间:2016-05-22 06:12:53

标签: php symfony orm doctrine-orm doctrine

我被一个看起来非常令人费解的问题所困扰。仅供参考 - 我知道并且我已经阅读了大部分的学说问题,因此我了解了学说的基本知识并指定了关系。

以下是我的数据模型的外观(发布相关的代码部分)

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

2 个答案:

答案 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()函数来填充该实际实体。

所以操作的顺序是:(据我所知)

  • 使用“相关字段”(analyese)数组
  • 构建Sample的实例
  • 构建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;
     }
}