2012-07-20 74 views
1

我對CakePHP相當陌生,並且遇到了一個我似乎無法找到一個好的解決方案的問題。我的應用有以下關聯:CakePHP爲什麼不使用SQL連接

  • 會員的hasMany投票
  • 卷的hasMany投票
  • 投票屬於關聯會員,滾動

我想檢索所有的由成員投的票和與每個投票相關的票卷。以下代碼產生完美結果:

$this->Member->id = $id; 
$this->Member->contain(array('Vote' => 'Roll')); 
$this->set('member_data', $this->Member->read()); 

不幸的是,這段代碼的效率也很低。而不是僅僅做這樣的事情SELECT * FROM votes JOIN rolls ON votes.roll_id = rolls.id WHERE votes.member_id = 100,蛋糕執行以下操作:

  1. SELECT * FROM votes WHERE member_id = 100
  2. SELECT * FROM rolls WHERE roll_id = 1
  3. SELECT * FROM rolls WHERE roll_id = 2
  4. SELECT * FROM rolls WHERE roll_id = 3
  5. SELECT * FROM rolls WHERE roll_id = 4
  6. 等等 - 一個大問題超過500時,卷配!

如何在使用read()方法時提高效率?

+0

您所指定的模型關係? – 2012-07-20 11:32:43

+0

是的。在三個模型中的每一箇中,我都從上面的項目符號列表中指定了關聯。 – 2012-07-20 11:35:47

+0

即使當Roll和Vote之間的關係改變爲Roll hasOne Vote時,也可能會出現這個問題。 – 2012-07-20 12:14:54

回答

2

我想你可以從投票模式嘗試,試試這個代碼:

$this->Vote->recursive = 0; 
$this->Vote->find('all',array('conditions'=>array('Vote.member_id'=>100))); 
+0

這工作得很好,但我更感興趣**爲什麼**我以前的嘗試是如此低效。稱之爲教學機會。 – 2012-07-20 12:10:34

+0

你想要根據你的查詢從表中獲取數據,並試圖訪問與成員表,這使得它更復雜,所以如果你想從任何表中獲取數據嘗試使用相同的模型,關係會自動填充 – Krishna 2012-07-20 12:12:40