【问题标题】:Cakephp pagination with random order?随机顺序的Cakephp分页?
【发布时间】:2013-05-09 21:50:46
【问题描述】:

好的,我已经看了又看,但似乎在任何地方都找不到任何东西。我有一个漂亮的分页结果显示,但它们目前按升序显示。我希望它们以随机顺序显示。这是我当前的控制器代码:

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);


}

【问题讨论】:

    标签: cakephp pagination cakephp-2.0 sorting cakephp-model


    【解决方案1】:

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

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

    这会在对分页器的调用之间保留RAND() 种子,并在请求之间保留结果的整体顺序。

    【讨论】:

    • 太棒了!你能给出一个链接或显示一些关于如何生成种子的代码吗?
    • 当然,只要您将其更改为我的答案。 :) 丑陋的 PHP:function random_float($min, $max, $round = 10){ $randomfloat = $min + mt_rand() / mt_getrandmax() * ($max - $min); if($round > 0) $randomfloat = round($randomfloat,$round); return $randomfloat; }
    【解决方案2】:

    这对我来说似乎在 CakePHP 2 上运行良好:

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

    这是使用 MySQL RAND() 函数,Cake 只是将其传递给数据库。

    编辑:现在我考虑一下,这不是一个好主意,因为页面之间没有保持顺序。我想不出一个好的方法来随机化顺序并保持页面之间的连续性。或许如果您要使用 JavaScript 随机播放页面上的项目?

    【讨论】:

    • 你知道吗,我之前尝试过 'order' => array('Unit.unitnum'=>'RAND()') 的语法错误我的页面疯了。这正是我需要的东西,谢谢!!!
    • 是的,我明白你的意思了。我想我会通过他们表格中的某些东西对我的结果进行排序,这会使它们看起来很混乱。很好的收获,谢谢!
    • 是的,您可以创建一个“订单”字段,并让 Cake 通过 cron 作业定期更改它。
    • 请参阅下面的答案,以获取保留请求之间的 RAND() 顺序的答案。
    猜你喜欢
    • 2018-07-04
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2013-10-04
    • 1970-01-01
    相关资源
    最近更新 更多