1

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

在上一个问题中,我了解到,为了将阈值分数应用于搜索结果,我需要使用HAVINGMySQL 关键字。由于 CakePHP 本身不支持此功能,因此我需要下拉到自定义查询以完成此操作。

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

但是,由于我仍然希望能够在索引上正常分页,因此我不想更改模型中的正常分页行为。

有什么办法可以(咳咳)我的蛋糕也吃吗?

4

2 回答 2

3

实际上,如果您可以使用 find 来做到这一点,那么您可以使用 paginate 来做到这一点。你可以看看这里

但更具体一点,您可以将在 find 中使用的条件/限制/字段/包含/订单等添加到分页功能。

我没有在分页中使用组,但它应该可以工作: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() 中做类似的事情,这样你就有一个选择性的分页。记住在不需要时执行 unset $conditions['have'] 或记住将其放在不影响您查找的地方;)

于 2011-09-27T13:55:10.910 回答
1

实际上,让这个工作比你合理预期的更令人头疼。

虽然我基本上遵循了 api55 的建议(谢谢!),但我也跳过了许多其他障碍:

  • 这是不可能parent::paginateCount()。我通过在 app_model.php 中用不同的(显然更好的)版本覆盖它来克服这个问题。

  • 因为paginateCount()它只是一个包装器find('count'),所以它不接受fields参数。这对我来说很棘手,因为我依靠它来挤入我的派生列(全文搜索的分数)。我通过将fields两次的值传递给paginate- 一次为fields和一次为“ sneaky”来解决这个问题。Cake 将它无法识别的任何参数放入extra数组中。

  • 把它结合在一起,我在我的模型中有一个覆盖,paginateCount()它看起来是否extra有一个名为“sneaky”的键。如果是,它会执行 afind('all')并使用 的内容sneaky来填充字段。

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

于 2011-09-28T18:39:03.407 回答