2011-08-31 48 views
0

我有兩個表,說:如何在CakePHP中有很多沒有外鍵?

TAB1 
---- 
id 
tab1_md5 


TAB2 
---- 
id 
tab2_md5 

我想創建一個沒有外鍵一個的hasMany關係,以便能夠使用CakePHP遞歸的東西,但不知道如何創建的關係。 我已經試過:

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

,但我不知道我應該在條件指定

編輯:關係是tab1.tab1_md5 = tab2.tab2_md5

+1

關係的條件是什麼,這兩個表如何相關? – deceze

+0

您可以通過「能夠使用cakephp遞歸的東西」來指定您的意思嗎? –

+0

我相信他意味着控制器中的遞歸變量能夠在搜索模型數據時拉動相關模型 – 8vius

回答

0

我不相信你可以做一個hasMany關係而不使用外鍵。那時CakePHP不知道這些表應該如何關聯。在不知道關係的情況下,它不能進行任何連接來包含關聯的表數據。

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自動效果。