我有一个表“人”,具有一对多的自我关系,“母亲”和“父亲”,他们当然是人。所以“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没有parentor就不存在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