我有一个成员表:成员(id,name,gender,head_id)
我想要的是建立基于户主(谁是成员)的家庭关系。就像这样:一个成员属于一个家庭(由成员定义)
也许我可以把它分成 2 个表,一个成员和家庭表:家庭(id,head_id)和成员表会有一个family_id而不是head_id。
主要问题是添加新成员和修改关系。
编辑:所有的答案都很棒。
我最终手动完成。Dave 的解决方案是我一直在寻找的,但并没有完全按照我希望的方式锻炼。
请参阅“同一模型的多个关系”
“也可以创建自我关联,如下所示:”
class Post extends AppModel {
public $belongsTo = array(
'Parent' => array(
'className' => 'Post',
'foreignKey' => 'parent_id'
)
);
public $hasMany = array(
'Children' => array(
'className' => 'Post',
'foreignKey' => 'parent_id'
)
);
}
从数据库的角度来看,我认为您应该有 3 个表:
一个家庭被定义为两个人的结合,并且可能有一些其他的共同领域,例如姓氏。
无论如何,如果您按照自己的方式进行操作,则只需一张桌子即可。(父亲head_id
设置为 0,其他家庭成员head_id
参考他的 id。
如果要使用两个表,控制器可以使用多个模型,因此在save
操作中处理更多表不是问题。
你应该有两张桌子。这是最好的方法,并且会在您的应用程序中为您提供最大的灵活性和易用性。
数据库表
// families
id | name
------------------------------
1 | Smith
2 | Jones
3 | Davis
// members table
id | family_id | name | gender
-----------------------------------
1 | 2 | James | M
2 | 3 | Christine | F
3 | 1 | David | M
4 | 2 | Mark | M
5 | 1 | Simon | M
6 | 1 | Lucy | F
CakePHP 模型
然后,您只需要定义您的模型,以便它们具有正确的关系。
// app/Model/Family.php
class Family extends AppModel {
public $hasMany = array('Member');
}
// app/Model/Member.php
class Member extends AppModel {
public $belongsTo = array('Family');
}
然后你可以像这样检索你的家人:
CakePHP 控制器
// Find all members that belong to Family 1
$family = $this->Member->find('all', array(
'conditions' => array('family_id' => 1)
));
或者
// Find Family 1 and get all its members
$family = $this->Family->find('first', array(
'conditions' => array('family_id' => 1),
'contain' => array('Member')
));
您在添加新成员或修改关系方面应该没有任何问题,就像您担心的那样,但如果您遇到任何具体问题,我们可能会为您提供帮助。这种模型关系极为普遍。