gpt4 book ai didi

php - Doctrine 可空一对一关系仍然想要创建唯一索引

转载 作者:行者123 更新时间:2023-11-29 06:45:21 25 4
gpt4 key购买 nike

我有一个 Person 实体,它与 Location 表有两个关系(hometowncurrent)。这两个字段都可以为空,否则它们必须存在于 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);

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

你能帮帮我吗?

最佳答案

OneToOne 关系是唯一的,因为它意味着只能将一个 person 分配到一个 location 和一个 location 给一个

在您的场景中,您可能希望一个 person 有多个位置,一个 location 可以有多个 person。这将是一个 ManyToMany 关系。

在 Doctrine 中,当您使用 ManyToMany 时,您将指定 Doctrine 将管理的 JoinTable(您不必为 JoinTable< 创建实体)。 JoinTableManyToMany 分解为类似 OneToMany 的东西,例如一个 person 到多个 location(s) 如下例所示。 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 分配给hometowncurrent 也没关系,不会占用空间。当您确实有一个 location 可以分配给 hometowncurrent 时,它必须是一个有效的 location 来自location 表。

关于php - Doctrine 可空一对一关系仍然想要创建唯一索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18971781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com