主义可以为空的一对一关系仍然想要创建唯一索引

时间:2013-09-24 01:56:33

标签: php mysql sql symfony doctrine-orm

我有一个Person实体,它有两个关系(hometowncurrent)到Location表。这两个字段都可以为null,否则它们必须存在于Location表中:

class Person {
.....
/**
 * @var Location
 * @ORM\OneToOne(targetEntity="Location")
 * @ORM\JoinColumn(name="hometown_id", referencedColumnName="id",nullable=true)
 **/
protected $hometown;

/**
 * @var Location
 * @ORM\OneToOne(targetEntity="Location")
 * @ORM\JoinColumn(name="current_id", referencedColumnName="id", nullable=true)
 **/     
 protected $current;
....
}

现在,我想基于doctrine:schema:update --dump-sql输出更新我的数据库架构,但它会产生问题:

CREATE UNIQUE INDEX UNIQ_8D93D6494341EE7D ON person (hometown_id);
CREATE UNIQUE INDEX UNIQ_8D93D649B8998A57 ON person (current_id);

我无法定义这些索引,因为表中有多个空行。

你能帮帮我吗?

2 个答案:

答案 0 :(得分:2)

OneToOne关系是唯一的,因为这意味着只能将一个person分配给一个location,将一个location分配给一个person。< / p>

在您的方案中,您希望一个person有多个位置,一个location可能有多个person(s)。这将是ManyToMany关系。

在Doctrine中使用ManyToMany时,您将指定Doctrine将管理的JoinTable(您不必为JoinTable创建实体)。 JoinTableManyToMany细分为OneToMany,例如personlocationJoinTable,如下例所示。 /** * @ORM\ManyToMany(targetEntity="Location") * @ORM\JoinTable(name="hometown_location", * joinColumns={@ORM\JoinColumn(name="person_id", referencedColumnName="id", unique=true)}, * inverseJoinColumns={@ORM\JoinColumn(name="location_id", referencedColumnName="id")} * ) **/ protected $hometown; /** * @ORM\ManyToMany(targetEntity="Location") * @ORM\JoinTable(name="current_location", * joinColumns={@ORM\JoinColumn(name="person_id", referencedColumnName="id", unique=true)}, * inverseJoinColumns={@ORM\JoinColumn(name="location_id", referencedColumnName="id")} * ) **/ protected $current; public function __construct() { $this->hometown = new \Doctrine\Common\Collections\ArrayCollection(); $this->hometown = new \Doctrine\Common\Collections\ArrayCollection(); } 会在应用时存储您想要的值。

location

如果没有hometown分配给currentlocation,则没有空间占用。 如果您要hometown分配给currentlocation,则必须是location表中的有效{{1}}。

答案 1 :(得分:0)

看起来你正在寻找FOREIGN KEY

http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

ALTER TABLE `Person` ADD INDEX ( `hometown_id` ) ;
ALTER TABLE `Person` ADD FOREIGN KEY ( `hometown_id` ) REFERENCES `Location` ( `id` )
ON DELETE RESTRICT ON UPDATE RESTRICT ;

ALTER TABLE `Person` ADD INDEX ( `current_id` ) ;
ALTER TABLE `Person` ADD FOREIGN KEY ( `current_id` ) REFERENCES `Location` ( `id` )
ON DELETE RESTRICT ON UPDATE RESTRICT ;