我有一张桌子'人'与一对多的自我关系,'母亲'和'父亲',当然他们是人。所以'person'表有两个可选字段,'mother_id'和'father_id'指向同一个表中的其他行。
我应该使用BELONGS_TO,HAS_ONE吗?
重要的是要说母亲和父亲是选择权,就系统而言,孤儿是一个有效的实体,当然,母亲或父亲除了指出他/她是父亲的现存者之外没有特别的区别/母亲。
同样重要的是要提到,因为系统与了解某个人的孩子无关,所以只知道某个人的父母。
答案 0 :(得分: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
这样的JOIN,你不能用Yii的关系来定义。因此,您可以定义两个关系并编写一个类似getChildren()
的getter来创建mothersChildren
和fathersChildren
关系上的联合。
答案 1 :(得分:1)
BELONGS_TO
通常用于反向关系(child => parent),而HAS_ONE
用于forward-relation(parent => child)。因此,在我的建议HAS_ONE
中,你最好的选择。
本案例中的另一个重要概念是Weak Entity
的概念。没有Weak Entity
或parent
,strong entity
不存在。每当您从Weak Entity
转发回Strong Entity
时,在其他情况下始终使用BELONGS_TO
和HAS_ONE
。
弱实体示例:UserProfile
User
HAS_ONE
UserProfile
UserProfile
BELONGS_TO
A User
。
如果没有UserProfile
记录,则记忆User
不存在,因此其实体较弱。
在你的情况下,我不确定你说one to many, 'mother' and 'father'
然而,一些可能的关系可能是:
如果您正在谈论第三种情况,则关系将为BELONGS_TO