假设(缺乏更好的例子的)我有一个模型Person和另一个模型双床(意味着一对双胞胎)。双胞胎有两个人外键,说first_born_id和second_born_id引用的两个不同的人(亲自)ID字段。我如何在蛋糕建立的关系?

我猜双床会碰到这样的:

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

但后来当我有一个人,我想知道它的孪生兄弟,我需要检查这两个关系。我想我希望有一种方式来获得在人是一个“双”的关系表示任何的两种方式一个人可以在双关系。

还是有更好的方式来设置?

有帮助吗?

解决方案

我同意双床例子是有点混乱。让我假设你有(在你的例子双床)一Product模型,它总是连有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'
    )
);

基本上,你应该更换hasOnehasMany。每个组件的hasMany产品它是第一个组件。与此同时,它的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)如果上面的方法不起作用(蛋糕,然后现在的行为怪异的),你也可以使用一个连接,使之服从。在像这样的组件模型创建一个函数:

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

其他提示

为什么你会定义一个双胞胎这样吗?

一个双,第一或第二出生是一个人。的事情,他们与父母的同事是事实他们是一个“孩子”和他们的“DOB”是一样的。

那么,你会不会做这样的事情:

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

在PARENT_ID存储到儿童的记录,而双由用于DOB父下比较所有的儿童来确定

这是否任何容易设置你的CakePHP的关系?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top