【问题标题】:Getting unexpected result if using pagination on random find query in cakephp 4?如果在 cakephp 4 中对随机查找查询使用分页会得到意想不到的结果?
【发布时间】:2021-08-29 18:12:52
【问题描述】:

我正在尝试使用分页以随机顺序查找所有产品。却得到了意想不到的结果。 这是我的控制器代码:

$this->paginate = ['maxLimit' => 20];
$articlesData = $this->Products->find('all');
$articlesData->order('RAND()');
$articles = $this->paginate($articlesData);

所以我每次都得到随机结果,这是页面的需求。我有 200 种产品。假设第一项是第一页上的 item-12,那么如果我转到下一页并再次转到上一页,那么第一项应该是 item-12,但它是随机变化的。有什么解决办法吗?

我需要分页,因为产品数量很快就会达到 1000 个。并且需要随机结果,因为我不希望该用户在第一页上看到相同的第一个产品。第一个产品应该在第一页上,但不是每次都在同一个位置。有什么方法可以让我按随机顺序制作 20 个项目的分页数组?

欢迎所有建议。

【问题讨论】:

  • 我看不出随机结果和分页之间有什么逻辑。如果您偶尔会在不同的页面上看到相同的条目,为什么要分页?
  • 我需要分页,因为产品数量很快就会达到 1000。并且需要随机结果,因为我不希望该用户在第一页上看到相同的第一个产品。第一个产品应该在第一页上,但不是每次都在同一个位置。有什么方法可以让我按随机顺序制作 20 个项目的分页数组?

标签: cakephp cakephp-4.x


【解决方案1】:

如何在视图模板中重新排列结果的示例。在控制器中选择最新的文章,但在模板中每次显示这 20 个结果的位置不同。

#Controller

$this->paginate = ['maxLimit' => 20];
$articlesData = $this->Products->find();
$articlesData->orderDESC('creates');
$articles = $this->paginate($articlesData);
$this->set(compact('articles'));

#模板

foreach(shuffle($articles->toArray() as $article) {
    echo $article['name'];
}

https://www.w3schools.com/php/func_array_shuffle.asp

【讨论】:

  • 谢谢!明白了逻辑。需要做一些解决方法。
【解决方案2】:

当您随机订购它们时,它们是随机订购的。每个页面加载都将是一个新的随机顺序。有关如何使订单可预测的示例,请参阅this;例如,您可以使用用户 ID 为生成器播种,那么给定用户的顺序将始终相同。或者结合用户详细信息和日期,明天给他们一个不同的随机订单。或者随机生成一个种子,然后将其保存在会话中以更精确地控制持续时间。

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 2017-01-09
    • 2020-03-04
    • 1970-01-01
    • 2019-01-18
    相关资源
    最近更新 更多