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

sczxawaw  于 2022-11-11  发布在  PHP
关注(0)|答案(2)|浏览(142)

蛋糕PHP 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()的值是从哪里得到的??
为便于说明,用于最后一个条件的PHP如下所示:

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

那么debug($query);将显示生成的实际SQL为

SELECT ... LIMIT 250 OFFSET 1000

假设许多库(例如DataTable)只为您提供LIMIT(250)和OFFSET(1000)的值,那么您应该如何计算Cake从数据库生成实际结果所需的page()值呢?

13z8s7eq

13z8s7eq1#

答案是offset()方法,这是由@ndm在注解中提供的。
这个方法没有很好的文档记录--它没有出现在Cookbook中,但是出现在API文档中:https://api.cakephp.org/3.5/class-Cake.Database.Query.html#_offset
所以,这个问题的答案是可以这样做的:

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

另外值得注意的是,Cookbook并没有记录每一个特性。有些东西出现在API文档中,而Cookbook中没有,所以两者都值得检查。这是一个很好的例子。

k4ymrczo

k4ymrczo2#

也许现在回答这个问题已经太晚了,但是最近我在构建分页查询时遇到了类似的问题,因此我对这个问题有了一些了解。
当我们设置limit($limit)->page($page)时,这将把所有结果分成相等的部分,每个部分有$limit个结果。因此,想象一下,这是多个页面,每个页面有$limit个结果。那么$page将间接地充当这个查询的偏移量。
例如,LIMIT 250 OFFSET 1000将是总结果除以250个结果。然后我们需要第1000个偏移量的结果。由于偏移量索引是从0开始的,因此该偏移量将位于第5页-第1001条记录。这意味着应该给page()的值将是5。

相关问题