Doctrine 2 - 禁止ManyToOne关系的外键上的空值

时间:2011-05-26 09:45:39

标签: php doctrine-orm relationship many-to-one

我的一个实体中有一个ManyToOne关系,如下所示:

class License {
    // ...
    /**
     * Customer who owns the license
     * 
     * @var \ISE\LicenseManagerBundle\Entity\Customer
     * @ORM\ManyToOne(targetEntity="Customer", inversedBy="licenses")
     * @ORM\JoinColumn(name="customer_id", referencedColumnName="id")
     */
    private $customer;
    // ...
}

class Customer {
    // ...
    /**
     * Licenses that were at one point generated for the customer
     * 
     * @var \Doctrine\Common\Collections\ArrayCollection
     * @ORM\OneToMany(targetEntity="License", mappedBy="customer")
     */
    private $licenses;
    // ...
}

这将生成一个数据库模式,其中允许许可表的“customer_id”字段为空,这正是我不想要的。

这里是一些代码,我创建一个记录来证明它确实允许引用字段的空值:

$em = $this->get('doctrine')->getEntityManager();
$license = new License();
// Set some fields - not the reference fields though
$license->setValidUntil(new \DateTime("2012-12-31"));
$license->setCreatedAt(new \DateTime());
// Persist the object
$em->persist($license);
$em->flush();

基本上,我不希望在未分配客户的情况下保留许可证。是否需要设置一些注释,或者我是否只需要将Customer对象传递给我的许可证的构造函数?

我使用的数据库引擎是MySQL v5.1,我在Symfony2应用程序中使用Doctrine 2.

3 个答案:

答案 0 :(得分:69)

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/annotations-reference.html#annref_joincolumn

nullable = false添加到JoinColumn注释:

@ORM\JoinColumn(..., nullable=false)

答案 1 :(得分:1)

刚发布,因为@ zim32并没有告诉我们应该把声明放在哪里,所以我不得不进行反复试验。

<强> YAML:

manyToOne:
    {field}:
        targetEntity: {Entity}
        joinColumn:
            name: {field}
            nullable: false
            referencedColumnName: {id}
        cascade: ['persist']

答案 2 :(得分:0)

我找不到如何执行此操作的 XML 示例,因此,如果其他人正在寻找此代码,我将在此处保留此代码段:

argmin

名称引用列名称是必需的,请参阅文档:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/xml-mapping.html#join-column-element