我可以在不覆盖默认分页的情况下对自定义查询进行分页吗?

时间:2011-09-27 13:26:09

标签: mysql cakephp pagination having

在我的CakePHP(1.2)应用程序中,我有两个使用分页的操作 - 索引和搜索。

在之前的一个问题中,我了解到,为了将阈值分数应用于搜索结果,我需要使用HAVING MySQL关键字。由于CakePHP不支持本地,我需要下拉到自定义查询以实现此目的。

我可以找到自定义查询分页的所有指南都涉及覆盖paginate()paginateCount()方法。

因为我仍然希望能够在索引上正常分页,所以我不想改变模型中的正常分页行为。

我有没有办法(咳咳)吃蛋糕并吃它?

2 个答案:

答案 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的内容填充字段。

像今天这样的日子我必须退后一步,记住使用框架的所有好处。