我正在使用Doctrine2构建数据库应用程序。我对外键映射感到有些困惑。我想知道,我的这些例子是否正确:
One-To-One:
X
只有一个Y
。
One-To-Many:
X
可以有多个Y
s。
Many-To-One:
多个X
可以拥有相同的Y
。
Many-To-Many:
多个X
可以有多个Y
s。
这让我困惑的具体情况如下:
User
只有一个HomeTown
。许多用户可以属于同一个家乡,因此User
的链接是:
/**
* @ORM\ManyToOne(targetEntity="HomeTown", inversedBy="localUsers")
*/
$homeTown;
并且相应的HomeTown
链接是:
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="homeTown")
*/
$localUsers;
或者是:
/**
* @ORM\OneToMany(targetEntity="User", mappedBy="homeTown")
*/
$localUsers;
非常感谢一些澄清!
我一直在关注http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html
答案 0 :(得分:1)
如果您有OneToMany
关联,则倒置必须为ManyToOne
。说,你的第二个选择是正确的。
提示:使用Doctrine CLI命令orm:validate-schema
也可能有助于识别此问题。
Symfony app中的完整路径:php app/console doctrine:schema:validate
答案 1 :(得分:1)
如果您希望一个城市拥有多个用户,则映射应如下所示
Entity City
/**
* @ORM\OneToMany(targetEntity="User", mappedBy="homeTown")
*/
private $users;
...
public function __construct()
{
$this->users = new ArrayCollection();
}
...
Entity User
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="users")
* @ORm\JoinColumn(name="home_town", referencedColumnName="id")
*/
private $homeTown;
此映射向我们显示拥有一方的City与User(目标实体)具有On-To-Many关系。反向的用户必须使用ManyToOne关系进行注释,因为许多用户具有相同的城市。当然,这里的目标实体应该是城市。重要的是指定哪个列使用JoinColumn批注中的referencedColumnName属性指向foreignkey。它显示了其他表的哪一列指向此键。在表User中的这个示例中,有一个名为“home_town”的列,它是一个指向表City
的列id的外键。在ManyToOne关系中,你使用JoinColumn注释
此映射也是双向的。
您可以使ID为Unidirectional,因为在用户实体中不使用“inversedBy =”属性,并从City实体中删除带有$ user属性的OneToMany注释。这类似于您必须了解特定用户的城市,但您不需要了解特定城市的所有用户