CakePHP中的多个关系

时间:2011-01-05 13:12:36

标签: cakephp models relationships

假设(缺少更好的例子)我有一个模型Person和另一个模型Twin(意思是一对双胞胎)。 Twins有两个Person外键,比如first_born_id和second_born_id引用两个不同人的id字段(在Person中)。如何在蛋糕中建立关系?

我猜Twin会有类似的东西:

$belongsTo = array('FirstBorn' => array('className' => 'Person',
                                        'foreignKey' => 'firstborn_id'),
                   'SecondBorn' => array('className' => 'Person',
                                         'foreignKey' => 'secondborn_id'));

但是我该如何设置Person?我可以这样做:

$hasOne = array('TwinAsFirstborn' => array('className' => 'Twin',
                                           'foreignKey' => 'firstborn_id'),
                'TwinAsSecondborn' => array('className' => 'Twin',
                                           'foreignKey' => 'secondborn_id'));

但是当我有一个人并且我想知道它的双胞胎时,我需要检查两种关系。我想我希望有一种方法可以在Person中获得一个“双胞胎”关系,代表一个人在双胞胎关系中的任何一种方式。

或者有更好的方法来设置它吗?

2 个答案:

答案 0 :(得分:1)

我同意Twin的例子有点令人困惑。假设您有一个Product模型(在您的示例中为Twin),并且它总是附加了2个Component模型。

components: id - name
products: id - component1_id - component2_id

我会按如下方式设置产品:

var $belongsTo = array(
    'Component1' => array(
        'className' => 'Component',
        'foreignKey' => 'component1_id'
    ),
    'Component2' => array(
         'className' => 'Component',
         'foreignKey' => 'component2_id'
    )
);

和组件:

var $hasMany = array(
    'ProductWithComponentAsComponent1' => array(
        'className' => 'Product',
        'foreignKey' => 'component1_id'
    ),
    'ProductWithComponentAsComponent2' => array(
        'className' => 'Product',
        'foreignKey' => 'component2_id'
    )
);

基本上,您应该将hasOne替换为hasMany。每个组件都有许多产品,它是第一个组件。与此同时,它有许多产品,它是第二个组成部分。希望能让事情变得清晰。

编辑1:(哦,“ProductWithComponentAsComponent#”仅用于解释。根据您的实际模型,您可以保留您喜欢的任何简短的甜蜜别名。)

编辑2:使用hasOne关系的简单经验法则 - 仅在将单个表格拆分为多个表格时使用它(如用户/个人资料)

编辑3:如果您想要一个组件的所有产品,那么您可以通过两种方式实现这一目标。

(A)在hasMany关系中将foreignKey定义为false

var $hasMany = array(
    'Product' => array(
        'className' => 'Product',
        'foreignKey' => false,
        'conditions' => array(
            'or' => array(
                "Product.component1_id = Component.id",
                "Product.component2_id = Component.id"
            )
        )
    )
);

(B)如果上述方法不起作用(Cake偶尔会出现奇怪的行为),您也可以使用连接使其服从。在Component模型中创建一个函数,如下所示:

function fetchProducts($id) {
    if (!$id) {
        return null;
    }
    return $this->Product->find('all', array(
        'fields' => array('Product.*'),
        'joins' => array(
            array(
                'table' => 'components',
                'alias' => 'Component',
                'foreignKey' => false,
                'type' => 'inner',
                'conditions' => array(
                    'or' => array(
                        "Product.component1_id = Component.id",
                        "Product.component2_id = Component.id"
                    ),
                    'Component.id' => $id
                )
            )
        )
    ));
}

答案 1 :(得分:0)

为什么要定义这样的双胞胎?

双胞胎,第一个或第二个出生的人是一个人。将他们与父母联系起来的事实是他们是“孩子”而他们的“DOB”是相同的。

所以你不会做类似的事情:

人 - >            ID,            名称,            年龄,            DOB,            PARENT_ID

parent_ID存储在childs记录中,双胞胎是通过比较DOB父级下的所有子项来确定的吗?

这是否可以让您更轻松地设置cakePHP关系?