如何计算CakePHP 3.x中page()使用的OFFSET值?

时间:2018-03-14 14:22:14

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

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)的值,您应如何计算page()值Cake需要从数据库中生成实际结果吗?

1 个答案:

答案 0 :(得分:2)

@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文档中出现了一些不在Cookbook中的内容,因此值得同时检查。这是这样一个很好的例子。