一对多,多对多等的定义

时间:2015-06-24 00:06:45

标签: symfony doctrine-orm

我正在使用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

2 个答案:

答案 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注释。这类似于您必须了解特定用户的城市,但您不需要了解特定城市的所有用户