我试图在Cakephp 3.0.0-RC1中使用自定义查找器进行分页。 The docs说我应该这样做:
$customFinderOptions = [
'tags' => $tags
];
$this->paginate = [
'finder' => [
'tagged' => $customFinderOptions
]
];
$articles = $this->paginate($this->Articles);
所以我的控制器方法包含
$this->paginate = [
'finder' => [
'recentActivity' => [
'limit' => 5,
'offset' => 2,
'foo' => 'bar'
]
]
];
$results = $this->paginate($this->ModelName);
在ModelNameTable::findRecentActivity()
的顶部,pr($options)
会产生以下结果:
Array
(
[foo] => bar
[whitelist] => Array
(
[0] => limit
[1] => sort
[2] => page
[3] => direction
)
)
limit
和offset
去了哪里?在CakePHP 3核心中挖掘了一下,我在ORM.Table.php的顶部看到了
public function callFinder($type, Query $query, array $options = [])
{
$query->applyOptions($options);
$options = $query->getOptions();
$finder = 'find' . $type;
if (method_exists($this, $finder)) {
return $this->{$finder}($query, $options);
}
啊,所以limit
和offset
进入了$query
。不幸的是,我无法想出一种实用的方法来从我的自定义查找器方法中取出它们。
我检查过,$options
准确反映了我在$options = $query->getOptions();
覆盖之前设置的选项,并删除了limit
和offset
值。
文档让我期望$options
被传递(完整)到我的自定义查找程序方法。所以我的问题是......
旁注:我知道我可以通过在$options
中使用不同的密钥来解决这个问题,例如foo_limit
和foo_offset
来完成我想要的工作。
答案 0 :(得分:1)
了解混乱的来源。除了我在问题评论中表达的关于你的查询可能相互矛盾的选项的问题,我认为你应该知道以下选项列表直接复制到查询中,而不是解释为你的finder方法的自定义选项:
这些选项将调用匹配的查询方法来设置其内部状态。
答案 1 :(得分:0)
原来......
$options
传递给自定义查找程序方法之前从$options
中删除。limit
始终被$this->paginate['limit']
或默认值20覆盖(同样使用page
) 。但看起来这已被确定为错误is going to be fixed。