【发布时间】:2010-11-08 07:34:59
【问题描述】:
我知道 Cake HABTM 关联在最好的时候是很棘手的,但我似乎让自己的生活变得更加艰难......
如果我想从 db 中返回一个随机的 Item,我可以在 Item 模型中这样做:
$random = $this->find('first', array(
'order' => 'rand()'
));
如果我想查找某个类别中的所有项目(其中项目与类别具有 HABTM 关系),我知道我可以通过 $this->Categories->find 获得结果集。
我的问题是:如何将两者结合起来,以便返回属于指定类别的随机项目?有什么简单的方法吗? (如果没有,我很乐意接受任何费力的建议,只要它有效;)
ETA:我可以通过 Containable 获得一些方法,也许:假设我添加了一行
'contain' => array('Categories'=>array('conditions'=>array('Categories.id'=>1))),
然后我不想返回一个空类别数组的项目结果,以将它们与“好”项目区分开来。但实际上我根本不想返回所说的 Item 结果......
ETA(2):如果 Categories 数组为空(感谢 http://nuts-and-bolts-of-cakephp.com/2008/08/06/filtering-results-returned-by-containable-behavior/ 的提示),我可以通过在 afterFind 中取消设置我的结果来获得解决方法,然后让我的随机查找函数直到它放弃得到结果:
while (!is_array($item)) {
$item = $this->random($cat);
}
但是呃,这会不会更笨重?无论如何,是时候让我停止编辑我的问题了,转而继续睡吧!
【问题讨论】:
-
ORDER BY rand() 是一种反模式。这将导致查询非常缓慢!我猜你只想要返回的前 X 行: rand() 将为所有行生成,然后所有行都将根据它进行排序,因此 rand() 不是索引字段。紧接着将是它返回的第一个 X。
-
是的,我看到 ORDER BY rand() 上出现了一些危险信号。它适用于我的小型测试数据库,我可以想象随着数据库的增长它无法承受。尽管如此,在处理完我当前的问题之后,找到一种更好的方法来检索随机记录似乎是下一个要解决的问题!
标签: cakephp has-and-belongs-to-many