【问题标题】:Why isn't CakePHP using SQL joins为什么 CakePHP 不使用 SQL 连接
【发布时间】: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 之类的事情,还做了以下事情:

  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() 方法的同时提高效率?

【问题讨论】:

  • 你指定模型关系了吗?
  • 是的。在三个模型中,我从上面的项目符号列表中指定了关联。
  • 值得注意的是,即使将 Roll 和 Vote 之间的关系更改为 Roll hasOne Vote,也存在此问题。
  • book.cakephp.org/2.0/en/core-libraries/behaviors/… 。这可能会对您有所帮助。

标签: cakephp join containable


【解决方案1】:

我想你可以试试投票模型,试试这个代码:

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

【讨论】:

  • 这很好用,但我更感兴趣的是为什么我之前的尝试如此低效。称之为教学机会。
  • 您想根据您的查询从投票表中获取数据并尝试使用成员表进行访问,这使得它更加复杂,因此如果您想从任何表中获取数据,请尝试使用相同的模型,关系将填充自动
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 2021-11-11
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
相关资源
最近更新 更多