2011-09-27 17 views
1

在我的CakePHP(1.2)应用程序中,我有两个操作都使用分页 - 索引和搜索。我可以在不覆盖默认分页的情况下对自定义查询进行分页吗?

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

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

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

有什么方法可以(ahem)有我的蛋糕,也吃了吗?

回答

3

其实如果你可以做到这一点,你可以用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'],或者记住将它放在某个不会影响您的搜索的地方;)

+0

这是一个有趣的解决方案,但不幸的是打破了paginateCount(),因为缺少名为“分数”的列。 –

+0

+1用于通过字符串窃取组中的“HAVING”子句。但是当你复印时,请照顾那些丑陋的卷曲报价。 – Johan

+1

对不起,感谢编辑 @TomWright嗯,这是真的,我想,你必须重写paginateCount()函数,在[book](http:// book)中读取更多的自定义查询。 cakephp.org/view/249/Custom-Query-Pagination)我发现你确实需要覆盖至少paginateCount();但是你可以做一些事情来区分使用哪一种,我在我的答案 – api55

1

实际上,让这个工作比您可能合理期望的更令人头疼。

虽然我基本上沿袭api55的建议(!谢谢)我也跳了其他障碍的负载:

  • not possibleparent::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的内容填充字段。

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

相关问题