【问题标题】:How do you calculate the OFFSET value used by page() in CakePHP 3.x?如何计算 CakePHP 3.x 中 page() 使用的 OFFSET 值?
【发布时间】:2018-03-14 14:22:13
【问题描述】:

CakePHP 3.x

根据docs

要限制行数或设置行偏移量,您可以使用limit()page() 方法:

// Fetch rows 50 to 100
$query = $articles->find()
->limit(50)
->page(2);

它的作用是生成以下 SQL 查询的等价物:

LIMIT 50 OFFSET 50

我不知道你如何计算值 2 以传递给page()?根据评论,它说“获取第 50 到 100 行”。

但是用 100/50 来获得 2 并不是答案。

假设您要计算以下的page() 值?

LIMIT 250 OFFSET 250  // page(2)

LIMIT 250 OFFSET 500  // page(3)

LIMIT 250 OFFSET 750  // page(4)

LIMIT 250 OFFSET 1000 // page(5)

我已经发表了评论 - 进行了一些调试 - page() 的值是什么来生成这些 OFFSET 查询。

我在这里错过了什么吗?如果我们以最后一个例子LIMIT 250 OFFSET 1000 为例,你从哪里得到page() 的值5??

为了澄清,用于最后一个条件的 PHP 如下所示:

$query = $model->find()->limit(250)->page(5);

然后debug($query);会显示实际生成的SQL是

SELECT ... LIMIT 250 OFFSET 1000

鉴于许多库(例如 DataTables)只会为您提供 LIMIT (250) 和 OFFSET (1000) 的值,您应该如何计算 Cake 需要生成的 page() 值数据库的实际结果?

【问题讨论】:

  • 你不需要...改用offset()
  • 记录在哪里?我刚刚在我链接到的文档上搜索了offset,但它不存在!不过它确实有效,非常感谢。
  • 在 API 文档中:api.cakephp.org/3.5/class-Cake.Database.Query.html#_offset。 Cookbook 没有涵盖整个 API,但在这种情况下,如果示例也显示 offset() 的用法也不会受到影响。
  • @ndm。由于食谱没有涵盖这个论点,我认为这条评论对其他人也可能有用,所以你为什么不把它作为答案呢?
  • @arilia 有时我在旅途中,只是留下一个简短的评论......有时 OP 在这种情况下会自己添加解决方案作为答案,有时不会,有时我稍后会添加一个。 ..如果您偶然发现这样的事情,请随意添加答案,除非有人指示自己添加答案,否则通常会受到赞赏:)

标签: php cakephp cakephp-3.0 cakephp-3.x


【解决方案1】:

@ndm 在评论中提供的答案是有一个offset() 方法。

此方法没有很好的文档记录 - 它没有出现在 Cookbook 中,但确实出现在 API 文档中:https://api.cakephp.org/3.5/class-Cake.Database.Query.html#_offset

所以,问题的答案是可以这样做:

$query = $model->find()->limit(250)->offset(1000);

还值得注意的是,Cookbook 并未记录所有功能。 API Docs 中出现了一些不在 Cookbook 中的内容,因此值得同时查看。这是一个很好的例子。

【讨论】:

  • 我第二次交叉检查 API。看到你会发现和学习的东西,你会很惊讶:]
【解决方案2】:

现在回答可能为时已晚,但最近我在构建分页查询时遇到了类似的问题,因此必须了解一下。

当我们设置limit($limit)->page($page) 时,这会将所有结果分成相等的部分,每个部分都有$limit 个结果。因此,将其想象为多个页面,每个页面包含$limit 的结果数。然后$page 将间接充当此查询的偏移量。

例如,LIMIT 250 OFFSET 1000 将是 - 将总结果分成各部分,每部分 250 个结果。然后我们想要第 1000 个偏移量的结果。由于偏移索引是从 0 开始的,因此该偏移将位于第 5 页 - 第 1001 条记录中。这意味着应该给 page() 的值将是 5。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-10
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多