【问题标题】:Cake HABTM Query, Order By Rand()Cake HABTM 查询,按 Rand() 排序
【发布时间】: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


【解决方案1】:

试试这个:

<?php
$this->Item->bindModel(array('hasOne' => array('ItemsCategory')));
$random = $this->Item->find('all', array(
  'order' => 'rand()',
  'conditions' => array('ItemsCategory.category_id' => '1')
  ));
?>

【讨论】:

  • 好电话,即时创建关联,正是我所需要的。当然,我花了半个小时才让它工作......因为我忘记正确撤消对 AfterFind 的更改。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-10-06
  • 2020-02-29
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2021-06-01
相关资源
最近更新 更多