我有一个表“人”,具有一对多的自我关系,“母亲”和“父亲”,他们当然是人。所以“person”表有两个可选字段,“mother_id”和“father_id”指向同一张表中的其他行。
我应该同时使用 BELONGS_TO、HAS_ONE 吗?
重要的是要注意母亲和父亲是可选的,就系统而言,孤儿是一个有效的实体,当然,除了将他/她作为父亲/母亲的存在的人之外,母亲或父亲没有特定的区别。
同样重要的是要提到,对于系统来说,了解某人的孩子是无关紧要的,只有了解某个人的父母才有意义。
我有一个表“人”,具有一对多的自我关系,“母亲”和“父亲”,他们当然是人。所以“person”表有两个可选字段,“mother_id”和“father_id”指向同一张表中的其他行。
我应该同时使用 BELONGS_TO、HAS_ONE 吗?
重要的是要注意母亲和父亲是可选的,就系统而言,孤儿是一个有效的实体,当然,除了将他/她作为父亲/母亲的存在的人之外,母亲或父亲没有特定的区别。
同样重要的是要提到,对于系统来说,了解某人的孩子是无关紧要的,只有了解某个人的父母才有意义。
您可以使用这样的组合:
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()
来创建联合mothersChildren
和fathersChildren
关系。
BELONGS_TO
通常用于反向关系(child=>parent),而HAS_ONE
用于正向关系(parent=>child)。因此,在我的建议中,你最好的选择是HAS_ONE
。
在这种情况下,另一个重要的概念是 的概念Weak Entity
。Weak Entity
没有parent
or就不存在strong entity
。每当您指的Weak Entity
是Strong Entity
始终使用BELONGS_TO
和HAS_ONE
在其他情况下。
弱实体示例:UserProfile
User
HAS_ONE
UserProfile
一个。UserProfile
BELONGS_TO
_User
RememeberUserProfile
没有User
记录就不存在,因此它的实体很弱。
在你的情况下,我不确定你什么时候说 one to many, 'mother' and 'father'
然而,一些可能的关系可能是:
如果您在谈论第三种情况,则关系将是BELONGS_TO