我可以在不覆盖默认分页的情况下对自定义查询进行分页吗?
在我的CakePHP(1.2)应用程序中,我有两个操作都使用分页 - 索引和搜索。我可以在不覆盖默认分页的情况下对自定义查询进行分页吗?
在之前的问题中,我了解到,为了将阈值分数应用于搜索结果,我需要使用HAVING
MySQL关键字。由于CakePHP本身不支持,我需要下拉到一个自定义查询才能完成此操作。
我可以找到自定义查询分页的所有指南都涉及重写paginate()
和paginateCount()
方法。
因为我仍然希望能够在索引上正常分页,但是我不想改变模型中的正常分页行为。
有什么方法可以(ahem)有我的蛋糕,也吃了吗?
其实如果你可以做到这一点,你可以用paginate做到这一点。你可以看看here
但更具体一点,你可以添加条件/限制/领域/包含/订单等你在查找使用paginate函数。
我没有使用组在PAGINATE但它应该工作:d
你的情况,你就会有这样的事情:
$this->paginate = array(
'fields' => array(
'Product.category_id',
'COUNT(Product.hotel_id) as total'
),
'group' => array(
'Product.category_id HAVING COUNT(Product.hotel_id) > 1')
)
);
$data = $this->paginate('Product');
希望工程,发表您的结果的评论,如果它不起作用,你将不得不重写它,因为它不接受组条件......虽然我认为它会起作用,因为分页是最终的发现。
编辑:
你可以尝试做这样的事情:
覆盖的PAGINATE()和paginateCount(),但有一个调整,偷偷的条件,所以你可以告诉我们,如果它是一个分页具有或不。事情是这样的:
function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()){
//if no having conditions set return the parent paginate
if (empty($conditions['having'])
return parent::paginate($conditions, $fields, $order, $limit, $page, $recursive, $extra)
//if having conditions set return your override
//override code here
}
那么你就在paginateCount类似的东西(),这样你有选择性PAGINATE。请记住在不需要时设置$ conditions ['having'],或者记住将它放在某个不会影响您的搜索的地方;)
实际上,让这个工作比您可能合理期望的更令人头疼。
虽然我基本上沿袭api55的建议(!谢谢)我也跳了其他障碍的负载:
这not possible做
parent::paginateCount()
。我用app_model.php中的different (and apparently better) version覆盖了它。因为
paginateCount()
只是find('count')
的包装,它不接受fields
参数。这对我来说很棘手,因为我依靠这个来挤压我的派生列(全文搜索的分数)。我通过将fields
的值两次传递给paginate
- 一次作为fields
和一次作为“sneaky
”来解决此问题。 Cake将其不识别的参数放入extra
阵列中。把它们连在一起,我在我的模型中覆盖了
paginateCount()
,看看extra
是否有一个叫做“sneaky”的键。如果是,则它执行find('all')
并使用sneaky
的内容填充字段。
像今天这样的日子,我必须退后一步,记住关于使用框架的所有优点。
这是一个有趣的解决方案,但不幸的是打破了paginateCount(),因为缺少名为“分数”的列。 –
+1用于通过字符串窃取组中的“HAVING”子句。但是当你复印时,请照顾那些丑陋的卷曲报价。 – Johan
对不起,感谢编辑 @TomWright嗯,这是真的,我想,你必须重写paginateCount()函数,在[book](http:// book)中读取更多的自定义查询。 cakephp.org/view/249/Custom-Query-Pagination)我发现你确实需要覆盖至少paginateCount();但是你可以做一些事情来区分使用哪一种,我在我的答案 – api55