Doctrine 2无法在manyToOne关系中使用nullable=false吗?

121
一个用户(User)有一个与之关联的包(Package),多个用户可以指向同一个包。没有定义 Package ,就不能存在 User。关系应该由 User 拥有。关系是双向的,因此一个 Package 中可以有零个或多个用户。
这些要求导致 Doctrine 2 中的 User 具有 ManyToOne 关系,而 Package 具有 OneToMany 关系。但是,在 user 表中的 package_id(外键)允许 null 值。我尝试设置 nullable=false,但是命令:
 php app/console doctrine:generate:entities DL --path="src" --no-backup

提示关系ManyToOne没有属性nullable,我漏了什么?

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;

}
2个回答

219

在你的ManyToOne关系上使用JoinColumn注解:

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

ManyToOne本身不能为nullable,因为它不涉及特定的列。另一方面,JoinColumn标识数据库中的列。因此,您可以使用像nullable或unique这样的“普通”属性!


谢谢,我已经尝试过了,但不幸的是package_id列仍被标记为Null - Yes,默认值为NULL。非常感谢任何帮助。 - gremo
6
没关系,双引号完全破坏了这个东西。也就是说 nullable="false" 是错误的! - gremo
你尝试过完全删除数据库并重新创建吗?我刚刚查看了我的数据库(使用与上述相同的JoinColumn注释),它被标记为NotNull! - Sgoettschkes
5
谢谢您,我一直在想为什么我不能将“@ORM\Column(nullable = true)”应用于我的ManyToOne关系以使其可为空! - Scott Flack
如果您配置了正确的选项,但仍然看到数据库列具有错误值,请记得清除实体管理器的元数据缓存。在Symfony上,您可以使用console doctrine:cache:clear-metadata命令。 - Massimiliano Arione

3

只有@ORM\JoinColumn(nullable=false)是必需的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接