蛋糕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()
值呢?
2条答案
按热度按时间13z8s7eq1#
答案是
offset()
方法,这是由@ndm在注解中提供的。这个方法没有很好的文档记录--它没有出现在Cookbook中,但是出现在API文档中:https://api.cakephp.org/3.5/class-Cake.Database.Query.html#_offset
所以,这个问题的答案是可以这样做的:
另外值得注意的是,Cookbook并没有记录每一个特性。有些东西出现在API文档中,而Cookbook中没有,所以两者都值得检查。这是一个很好的例子。
k4ymrczo2#
也许现在回答这个问题已经太晚了,但是最近我在构建分页查询时遇到了类似的问题,因此我对这个问题有了一些了解。
当我们设置
limit($limit)->page($page)
时,这将把所有结果分成相等的部分,每个部分有$limit
个结果。因此,想象一下,这是多个页面,每个页面有$limit
个结果。那么$page
将间接地充当这个查询的偏移量。例如,
LIMIT 250 OFFSET 1000
将是总结果除以250个结果。然后我们需要第1000个偏移量的结果。由于偏移量索引是从0开始的,因此该偏移量将位于第5页-第1001条记录。这意味着应该给page()
的值将是5。