教义2不能在manyToOne关系中使用nullable = false?


110

一个User有一个Package与它相关联。许多用户可以引用相同的程序包。User没有Package定义就不能存在。User应该拥有这种关系。关系是双向的,因此其中Package有零个或多个用户。

这些要求导致ManyToOne关系为UserOneToMany的关系Package的教义。然而package_iduser表(也就是外键)允许null值。我尝试设置nullable=false但命令:

 php app/console doctrine:generate:entities DL --path="src" --no-backup

nullable该关系没有属性ManyToOne我想念的是什么?

class User
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Package", inversedBy="users")
     */
    private $package;

}

class Package
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="User", mappedBy="package")
     */
    private $users;

}

编辑:解决。请注意,这是错误的(请注意双引号):

 @ORM\JoinColumn(name="package_id", referencedColumnName="id", nullable="false")

这是正确的:

@ORM\JoinColumn(name="package_id", referencedColumnName="id", nullable=false)

Answers:


192

在ManyToOne关系上使用JoinColumn批注:

/**
 * @ORM\ManyToOne(targetEntity="Package", inversedBy="users")
 * @ORM\JoinColumn(name="package_id", referencedColumnName="id", nullable=false)
 */
private $package;

ManyToOne本身不能为空,因为它与特定列无关。另一方面,JoinColumn标识数据库中的列。因此,您可以使用“正常”属性,例如可为空或唯一!


谢谢,我已经尝试过,但不幸的package_id是,该列仍标记为Null-是,默认值为NULL。任何帮助深表感谢。
gremo 2012年

5
没关系,双引号完全可以解决问题。那nullable="false"是错的!
gremo 2012年

您是否尝试完全删除数据库并新建数据库?我只是查看了我的数据库(使用与上述相同的JoinColumn批注),并将其标记为NotNull!
Sgoettschkes 2012年

5
谢谢你,我一直在想为什么我不能@ORM\Column(nullable=true)让我的多人可为空!
Scott Flack

如果您配置了正确的选项,但仍然看到错误的值的数据库列,请记住清除实体管理器的元数据缓存。在Symfony上,您可以使用console doctrine:cache:clear-metadata命令
Massimiliano Arione
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.