2012-01-04 90 views
0

我有4個表:CakePHP的 - SQL:連接表

stores {id, name, owner_id, city_id, ...} 
store_managers {id, store_id, user_id, ...} // since I'm not associating (i have my reasons) the table to the others by cake's association, the name is not by the cakePHP naming conventions. 
cities {id, name, ...} 
users {id, name, ...} 

現在..在stores_controller有一個名爲「stores_stats()」函數,它收集有關用戶,並顯示所擁有的商店的一些統計數據它。該owner_id從$this->Auth->user('id')
我想用一個$this->Store->find('all')調用來獲取以下信息來:

  1. 商店記錄本身。
  2. 各商店的店鋪經理。
  3. 每個商店的城市記錄。
  4. 商店記錄本身。

userscities表與stores表關聯和find('all')查詢正確返回有關它們的數據。我的問題是與store_managers表。如何將store_managers加入查詢? 而且,爲了讓它正確 - 我該如何自己編寫這樣的查詢? 下面的查詢給我的東西.. ..其他

SELECT * 
FROM stores 
LEFT JOIN cities ON stores.id = cities.id 
LEFT JOIN store_managers ON store_managers.store_id = stores.id 
WHERE stores.id = 122 AND stores.owner_id = 3 

回答

1

你可能會想使用CakePHP的中容納的行爲。 (read more about it here)。

//Store Model 
class Store extends AppModel { 

var $actsAs = array('Containable'); 

//associations 
//validation 

//the method you call from the controller 
function getStoreStats() { 
    $this->recursive = -1; 
    $params = array(); 
    $params['containable'] = array(
     'User' => array(
      'StoreManager', 
     ), 
     'City' 
    ); 
    $data = $this->find('all', $params); 
    return $data; 
} 
} 

的想法是,你設置遞歸到-1,這限制了你從商店返回到自身的數據。然後,使用可容納的,你指定你想要返回的其他相關數據。

確定您是否正在閱讀CakePHP書籍以驗證您的版本是否正確(1.3,2.0等)。

此外,這是很常見的,只是設置$this->recursive=-1;在應用模型做的是所有的默認。

假設您所有的關係都已正確設置,並且它們都不是HABTM關係,則Containable應該對您有用。

+0

謝謝,我同意。但我仍然需要連接和簡單的SQL方式..你能幫忙嗎? – yossi 2012-01-04 20:06:04

+0

你正在嘗試使用Cake的JOIN?或者只是讓它與常規的SQL一起工作? – Dave 2012-01-04 21:06:15

+0

兩者 - tho常規sql就足夠了 – yossi 2012-01-04 21:07:25

0

CakePHP的解決方案,這將是實現相對於專賣店的模式。如果有很多商店經理,你可以把這個代碼進入賣場模式:

$hasMany = array(
'StoreManagers' => array('className' => 'StoreManagers') 
); 

或者,如果只有一個門店經理:

$hasOne = 'StoreManagers'; 

如果你堅持的命名約定,查找()調用將返回數組,其中每個Store應該是'StoreManagers'項目(或數組),其中將獲取所有鏈接的項目。

更多關於連接表的主題看here

+0

謝謝,但正如我寫的 - 我不想關聯模型。我想爲此加入一個連接 – yossi 2012-01-04 20:04:23