我有一个Person
实体,它有两个关系(hometown
和current
)到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);
我无法定义这些索引,因为表中有多个空行。
你能帮帮我吗?
答案 0 :(得分:2)
OneToOne
关系是唯一的,因为这意味着只能将一个person
分配给一个location
,将一个location
分配给一个person
。< / p>
在您的方案中,您希望一个person
有多个位置,一个location
可能有多个person
(s)。这将是ManyToMany
关系。
在Doctrine中使用ManyToMany
时,您将指定Doctrine将管理的JoinTable
(您不必为JoinTable
创建实体)。 JoinTable
将ManyToMany
细分为OneToMany
,例如person
到location
个JoinTable
,如下例所示。 /**
* @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
分配给current
或location
,则没有空间占用。
如果您要hometown
分配给current
或location
,则必须是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 ;