2012-01-11 99 views
4

好吧,我看了看,但似乎无法在任何地方找到任何东西。我有一个精美的分页结果显示,但他们目前按升序显示。我想让他们以随机顺序显示。这是我目前的控制器代码:CakePHP分页与随机顺序?

public function condos() {   

$this->paginate['Unit']=array(
     'limit'=>9, 
     'contain'=>array(
       'User'=>array(
        'id', 'user_name', 'area_code', 'exchange', 'sln', 'email'), 
       'Complex'=>array('id','complex_name', 'realname', 'photo1','photo2','photo3','photo4','photo5', 'complex_website') 
        ), 
     'conditions'=>array(
       'Unit.type'=>array('condo', 'rentalco'), 
       'Unit.active'=>1) 
    ); 
$data = $this->paginate('Unit'); 
$this->set('allcondos', $data); 


} 

回答

6

对于其他人的发现 - 实际的答案是生成种子(0和1之间的浮点数),并在RAND()排序是必要的之前将其保存到会话中(在控制器的beforeFilter()中)。然后:

$this->paginate['order'] = sprintf('RAND(%f), $this->Session->read('seed'));

这将保留调用的分页程序之间的RAND()种子,并保留请求之间的结果的总体顺序。

+0

太棒了!你可以给一个链接或显示一些关于如何生成种子的代码? – huzzah 2012-08-13 13:58:57

+0

当然,只要你改变我的答案。 :) 的变丑PHP: '函数random_float($分钟,$最大,$圆= 10){ \t \t $ randomfloat = $分钟+ mt_rand()/ mt_getrandmax()*($最大 - $分钟); \t \t if($ round> 0) \t \t \t $ randomfloat = round($ randomfloat,$ round); \t \t \t return $ randomfloat; \t}' – 2012-08-14 02:41:17

+0

IZ丑陋,嘿嘿。 NP,很好的答案,谢谢! – huzzah 2012-08-14 16:39:48

0

这似乎在CakePHP的2工作得很好,我:

$this->paginate = array(
    'order' => 'RAND()' 
); 

这是使用MySQL RAND()功能,蛋糕只是传递到数据库。

编辑:现在我想到了,这不是一个好主意,因为订单不是在页面之间维护的。我想不出一个好办法,让我的头部随机化,并保持页面之间的连续性。也许如果你用JavaScript来洗牌页面上的项目?

+0

你知道吗,因为我曾尝试过'order'=> array('Unit.unitnum'=>'RAND()')和男孩,所以我的语法错误是因为我疯狂地打破了我的页面。这只是我需要的东西,谢谢! – huzzah 2012-01-11 22:43:42

+0

是的,我明白你的意思了。我想我只会求助于通过表格中的某些东西对结果进行排序,这会使它们显得杂乱无章。赶上那里,谢谢! – huzzah 2012-01-12 01:18:24

+0

是的,你可以创建一个“订单”字段,让Cake定期用cron作业进行更改。 – bjudson 2012-01-12 03:12:27