1

我有一个表“人”,具有一对多的自我关系,“母亲”和“父亲”,他们当然是人。所以“person”表有两个可选字段,“mother_id”和“father_id”指向同一张表中的其他行。

我应该同时使用 BELONGS_TO、HAS_ONE 吗?

重要的是要注意母亲和父亲是可选的,就系统而言,孤儿是一个有效的实体,当然,除了将他/她作为父亲/母亲的存在的人之外,母亲或父亲没有特定的区别。

同样重要的是要提到,对于系统来说,了解某人的孩子是无关紧要的,只有了解某个人的父母才有意义。

4

2 回答 2

2

您可以使用这样的组合:

return array(
    'father' => array(self::BELONGS_TO, 'Person', 'father_id'),
    'mother' => array(self::BELONGS_TO, 'Person', 'mother_id'),
    'mothersChildren' => array(self::HAS_MANY, 'Person', 'mother_id'),
    'fathersChildren' => array(self::HAS_MANY, 'Person', 'father_id'),
);

所以你想要一个HAS_MANY,而不是HAS_ONE你的孩子,因为每个人可能有多个孩子。

您还看到,有问题的关系是子关系:您必须使用LEFT JOIN person c ON t.mother_id=c.id OR t.father_id=c.id无法用 Yii 的关系定义的 JOIN。因此,您可以定义两个关系并编写一个 gettergetChildren()来创建联合mothersChildrenfathersChildren关系。

于 2013-10-24T06:33:29.103 回答
1

BELONGS_TO通常用于反向关系(child=>parent),而HAS_ONE用于正向关系(parent=>child)。因此,在我的建议中,你最好的选择是HAS_ONE

在这种情况下,另一个重要的概念是 的概念Weak EntityWeak Entity没有parentor就不存在strong entity。每当您指的Weak EntityStrong Entity始终使用BELONGS_TOHAS_ONE在其他情况下。

弱实体示例:UserProfile

User HAS_ONE UserProfile

一个。UserProfile BELONGS_TO_User

RememeberUserProfile没有User记录就不存在,因此它的实体很弱。

在你的情况下,我不确定你什么时候说 one to many, 'mother' and 'father'

然而,一些可能的关系可能是:

  1. 人:母亲::1:1
  2. 人:父亲::1:1
  3. 人:儿童::1:M

如果您在谈论第三种情况,则关系将是BELONGS_TO

于 2013-10-24T06:00:27.590 回答