Cakephp Cake HABTM查询,按兰德订购()

Cakephp Cake HABTM查询,按兰德订购(),cakephp,has-and-belongs-to-many,Cakephp,Has And Belongs To Many,我知道,在最好的时候,蛋糕的联想是很棘手的,但我似乎让自己的生活更加艰难 如果我想从db返回一个随机项,我可以在项模型中执行以下操作: $random = $this->find('first', array( 'order' => 'rand()' )); 如果我想找到某个类别中的所有项目(其中项目与类别有HABTM关系),我知道我可以通过$this->Categories->find获得一个结果集 我的问题是:如何将两者结合起来,以便返回属于指定类别的随机项?有什么简单

我知道,在最好的时候,蛋糕的联想是很棘手的,但我似乎让自己的生活更加艰难

如果我想从db返回一个随机项,我可以在项模型中执行以下操作:

$random = $this->find('first', array(
    'order' => 'rand()'
));
如果我想找到某个类别中的所有项目(其中项目与类别有HABTM关系),我知道我可以通过$this->Categories->find获得一个结果集

我的问题是:如何将两者结合起来,以便返回属于指定类别的随机项?有什么简单的方法吗?(如果没有,我很乐意接受任何建议,只要它可行,我会用一种费劲的方法;)

埃塔:我可以用Containable找到一些方法,也许:比如说我添加了一行

'contain' => array('Categories'=>array('conditions'=>array('Categories.id'=>1))),
然后,我不希望返回的项目结果带有一个空的类别数组,以将它们与“好”项目区分开来。但我真的不想说的项目结果被返回在所有

ETA(2):如果Categories数组为空,我可以通过在afterFind中取消设置结果(感谢提示),然后让我的random find函数在得到结果之前不放弃:

while (!is_array($item)) {
    $item = $this->random($cat);
}
但是,呃,这会更笨重吗?不管怎样,是时候让我停止编辑我的问题了,而去睡觉吧

试试这个:

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


ORDER BY rand()是一种反模式。这将导致一个非常慢的查询!我想您只需要返回前X行:将为所有行生成rand(),然后所有行将根据它进行排序,因此rand()不是索引字段。就在那之后,将是它返回的第一个X。是的,我看到rand()的订单上升起了一些红旗。它可以很好地用于我的小型测试数据库,我可以想象随着数据库的增长,它是不可能承受的。不过,找到一种更好的方法来检索随机记录似乎是在处理了我当前的记录之后要解决的下一个问题!很好的电话,创建一个动态的关联,这正是我所需要的。当然,我花了半个小时才把它修好。。。因为我忘了正确撤销对AfterFind的更改。谢谢