在我的CakePHP(1.2)应用程序中,我有两个使用分页的操作 - 索引和搜索。
在之前的一个问题中,我了解到,为了将阈值分数应用于搜索结果,我需要使用HAVING
MySQL关键字。由于CakePHP不支持本地,我需要下拉到自定义查询以实现此目的。
我可以找到自定义查询分页的所有指南都涉及覆盖paginate()
和paginateCount()
方法。
因为我仍然希望能够在索引上正常分页,所以我不想改变模型中的正常分页行为。
我有没有办法(咳咳)吃蛋糕并吃它?
答案 0 :(得分:3)
实际上如果你能做到这一点,发现你可以用分页来做。你可以看看here
但更具体的是,您可以在查找paginate函数时添加您在find中使用的条件/ limit / fields / contains / order等。
我没有在分页中使用group但它应该可以工作: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。记得在不需要的情况下进行未设置的$条件['have']或记得把它放在不影响你的发现的地方;)
答案 1 :(得分:1)
实际上让它发挥作用比你可能合理期望的更令人头疼。
虽然我基本上遵循了api55的建议(谢谢!)但我也遇到了其他一些障碍:
执行parent::paginateCount()
not possible。我通过用app_model.php中的different (and apparently better) version覆盖它来克服这个问题。
由于paginateCount()
只是find('count')
的包装,因此它不接受fields
参数。这对我来说很棘手,因为我依靠它来挤压我的派生列(全文搜索的分数)。我将fields
的值两次传递给paginate
- 一次为fields
,一次为“sneaky
”,从而克服了这个问题。 Cake将任何无法识别的参数放入extra
数组。
将这个绑在一起,我在模型中覆盖paginateCount()
,看看extra
是否有一个名为“偷偷摸摸”的键。如果是,则执行find('all')
并使用sneaky
的内容填充字段。
像今天这样的日子我必须退后一步,记住使用框架的所有好处。