如何在CakePHP中没有外键的hasMany?

时间:2011-08-31 10:40:18

标签: cakephp

我有两张桌子,比如说:

TAB1
----
id
tab1_md5


TAB2
----
id
tab2_md5

我想创建一个没有foreignKey的hasMany关系,以便能够使用cakephp递归的东西,但不知道如何创建关系。 我试过了:

var $hasMany = array(
'Tab2' => array(
'className' => 'Tab2',
'foreignKey' => false))

但我不知道我应该在条件中指定什么

编辑:关系是tab1.tab1_md5 = tab2.tab2_md5

2 个答案:

答案 0 :(得分:0)

我不相信你可以在不使用外键的情况下做一个hasMany关系。那时CakePHP不知道这些表应该如何相关。在不知道关系的情况下,它不能进行任何连接以包含关联的表数据。

答案 1 :(得分:0)

这是不可能的。 Cake必须执行单独的查询才能获取hasMany数据。在该单独的查询中,它仅使用相关模型的主键。 AFAIK目前无法使用除主键之外的任何东西。因此,您必须手动执行这些查询:

$tab1s = $this->Tab1->find('all', array(...));
$tab2s = $this->Tab2->find('all', array(
    'conditions' => array('Tab2.tab2_md5' => Set::extract('/Tab1/tab1_md5', $tab1s))
));

$grouped = array();
foreach ($tab2s as $tab2) {
    $grouped[$tab2['Tab2']['tab2_md5']][] = $tab2;
}
foreach ($tab1s as &$tab1) {
    $tab1['Tab2'] = isset($grouped[$tab1['Tab1']['tab1_md5']]) ? $grouped[$tab1['Tab1']['tab1_md5']] : array();
}

这些方面的东西。您可以在模型本身的afterFind回调中自动执行此操作,以获得Cake自动效果。