我有一个Person
实体,它与Location
表有两个关系(hometown
和current
),这两个字段都可以为空,否则它们必须存在于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);
我无法定义这些索引,因为表中有多个空行。
你能帮帮我吗?
3条答案
按热度按时间nwnhqdif1#
OneToOne
关系是唯一的,因为它意味着只能将一个person
分配给一个location
,将一个location
分配给一个person
。在您的场景中,您希望一个
person
具有多个位置,一个location
可以具有多个person
,这将是一个ManyToMany
关系。在Doctrine中使用
ManyToMany
时,您将指定Doctrine将管理的JoinTable
(不必为JoinTable
创建实体)。JoinTable
将ManyToMany
分解为类似OneToMany
的内容,例如一个person
到多个location
(s)如下例所示。JoinTable
将存储您想要的值。如果没有
location
可分配给hometown
或current
,也没关系,不会占用空间。如果有location
可分配给hometown
或current
,则必须是location
表中的有效location
。hsgswve42#
它看起来像你正在寻找外键
http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
nqwrtyyt3#
迟回复只是因为它显示在搜索:
你所描述的不是一对一的关联。当我们想象一个人的当前位置是他/她的家乡时,这就变得很清楚了。在这种情况下,
Person
的两个属性将具有相同的id
。一对一的关联通常共享相同的主键,因此Doctrine试图创建唯一的索引。这是ManyToOne关联,可以声明为:
注:注解未测试。