Doctrine OneToOne不正确?生成一个独特的索引

时间:2011-11-20 23:16:49

标签: symfony doctrine-orm

SchemaTool为OneToOne的关联生成唯一索引。我认为这是不正确的。

Doctrine的“关联”手册页的第6.6节显示了一个产品的OneToOne有一个送货的示例。这显示为生成Product表:

CREATE TABLE Product (
    id INT AUTO_INCREMENT NOT NULL,
    shipping_id INT DEFAULT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;

但是,对于我的实体的相同代码,用户有一个组织,我的用户表SQL生成为

CREATE TABLE User (
    id INT AUTO_INCREMENT NOT NULL,
    organisation_id INT DEFAULT NULL,
    UNIQ_3B978F9FA7F43455 (organisation_id),
    PRIMARY KEY(id)
) ENGINE = InnoDB;

这可以防止我添加2个具有相同组织的用户。不正确。

我添加了尝试使用唯一的JoinColumn注释参数的详细信息。

@JoinColumn(name="organisation_id", referencedColumnName="id", unique="false")

有什么想法吗?我似乎无法找到任何关于此事的内容。

由于

2 个答案:

答案 0 :(得分:47)

如果一个组织拥有多个用户且许多用户拥有一个且仅有一个组织,那么它就不是一对一的关联。

一对一的关联必须是唯一的。

您的关联在用户方ManyToOne和组织方OneToMany

user.php的

/**
 * @ManyToOne(targetEntity="Organisation")
 */
private $organisation;

Organisation.php

use Doctrine\Common\Collections\ArrayCollection;

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

function __construct() {
    $this->users = new ArrayCollection();
}

答案 1 :(得分:0)

也许YML版本可以帮助其他以doctrine / symfony开头的人。这是我的版本:

<强> User.orm.yml

manyToOne:
    organisation:
        targetEntity: Organisation
        joinColumn:
            name: organisation_id
            referencedColumnName: id

<强> Organisation.orm.yml

oneToMany:
    users:
        targetEntity: User
        mappedBy: organisation
        joinColumn:
            name: organisation_id
            referencedColumn: id

希望它有所帮助。