【发布时间】:2012-07-20 11:24:00
【问题描述】:
我对 CakePHP 还很陌生,遇到了一个我似乎找不到好的解决方案的问题。我的应用程序具有以下关联:
- 会员有很多投票
- Roll hasMany Vote
- 投票属于会员,滚动
我想检索成员所投的所有选票以及与每张选票相关的点名。以下代码产生了完美的结果:
$this->Member->id = $id;
$this->Member->contain(array('Vote' => 'Roll'));
$this->set('member_data', $this->Member->read());
不幸的是,这段代码效率也很低。 Cake 不仅做SELECT * FROM votes JOIN rolls ON votes.roll_id = rolls.id WHERE votes.member_id = 100 之类的事情,还做了以下事情:
SELECT * FROM votes WHERE member_id = 100SELECT * FROM rolls WHERE roll_id = 1SELECT * FROM rolls WHERE roll_id = 2SELECT * FROM rolls WHERE roll_id = 3SELECT * FROM rolls WHERE roll_id = 4- 等等——当超过 500 个掷骰匹配时,这是一个大问题!
如何在仍然使用 read() 方法的同时提高效率?
【问题讨论】:
-
你指定模型关系了吗?
-
是的。在三个模型中,我从上面的项目符号列表中指定了关联。
-
值得注意的是,即使将 Roll 和 Vote 之间的关系更改为
Roll hasOne Vote,也存在此问题。 -
book.cakephp.org/2.0/en/core-libraries/behaviors/… 。这可能会对您有所帮助。
标签: cakephp join containable