CakePHP多对一 - 单桌

时间:2012-12-09 19:24:37

标签: php database cakephp

我有一张会员表: 成员(id,name,gender,head_id)

我想要的是建立基于户主(谁是会员)的家庭关系。 它就像:一个成员属于一个家庭(由成员定义)

也许我可以把它分成2个表,一个成员和家庭表: 家庭(id,head_id) 而且Members表将有一个family_id而不是head_id。

主要问题是添加新成员和修改关系。

编辑: 所有答案都很棒 我最终手动完成了。戴夫的解决方案正是我所寻找的,但并没有按照我希望的方式进行锻炼。

3 个答案:

答案 0 :(得分:1)

请参阅"Multiple Relations to the Same Model"

“也可以创建自我关联,如下所示:”

class Post extends AppModel {

    public $belongsTo = array(
        'Parent' => array(
            'className' => 'Post',
            'foreignKey' => 'parent_id'
        )
    );

    public $hasMany = array(
        'Children' => array(
            'className' => 'Post',
            'foreignKey' => 'parent_id'
        )
    );
}

答案 1 :(得分:1)

从数据库的角度来看,我认为你应该有3个表:

  • (id,passport_number,name,dob,...)
  • 家庭(id,father_id,mother_id,姓氏,number_of_members,...)
  • families_persons (family_id,person_id)

一个家庭被定义为两个人的联合,可能还有其他一些共同的领域,例如姓氏。

无论如何,如果你这样做,你可以用一张桌子来做。 (父亲head_id设置为0,其余家庭成员head_id提及他的身份。

如果您想使用两个表,控制器可以使用多个模型,因此在save操作中处理更多表不是问题。

答案 2 :(得分:0)

你应该有两张桌子。这是最好的方式,并将在您的应用程序中为您提供最大的灵活性和易用性。

数据库表

// 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)
));

OR

// Find Family 1 and get all its members
$family = $this->Family->find('first', array(
    'conditions' => array('family_id' => 1),
    'contain' => array('Member')
));

添加新成员或修改关系不会有任何问题,就像您担心的那样,但如果您遇到任何特定问题,我们可能会帮助您。这种模式关系非常普遍。

相关问题