0

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

我猜双胞胎会有类似的东西:

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

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

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

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

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

4

2 回答 2

1

我同意双胞胎的例子有点令人困惑。让我假设您有一个Product模型(在您的示例中为 Twin),并且它始终Component连接有 2 个模型。

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

基本上,您应该将您的替换hasOnehasMany. 每个组件都有许多产品,其中它是第一个组件。同时,它有很多产品,它是第二个组成部分。希望这能让事情变得清楚。

编辑 1:(哦,“ProductWithComponentAsComponent#”只是为了解释。你可以根据你的实际模型保留你想要的任何简短、甜蜜的别名。)

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

编辑 3:如果您想要一个组件的所有产品,那么您可以通过两种方式执行此操作。

false(A)在你的 hasMany 关系中定义 foreignKey 。

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 时不时表现得很奇怪),您也可以使用 join 使其服从。在 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
                )
            )
        )
    ));
}
于 2011-01-05T18:47:19.203 回答
0

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

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

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

人员 -> ID、姓名、年龄、出生日期、Parent_ID

parent_ID存入childs记录,通过比较一个parent下的所有childs的DOB来确定双胞胎?

这是否让建立 cakePHP 关系变得更容易?

于 2011-01-05T13:20:12.640 回答