CakePHP将自定义查询从控制器传递到模型paginate()

时间:2012-01-12 02:26:43

标签: cakephp cakephp-2.0 cakephp-appmodel

我正在使用Cakephp 2.X版

我要运行sql,如:

 SELECT field1, field2, field3, field3,
            ( IF(LOCATE('abc', field1), 4, 0) + IF(LOCATE('abc', field2), 3, 0) + IF(LOCATE('abc', field3), 2, 0) ) AS score
            FROM sometable
            WHERE ( (field1 LIKE '%abc%')  OR  (field2 LIKE '%abc%')  OR  (field3 LIKE '%abc%') )
            ORDER BY score DESC

这个sql是由代码动态生成的。所以这个sql需要传递给paginate()函数才能通过cakephp进行分页。似乎cakephp分页功能不够灵活,无法处理复杂的sql。

要执行这个复杂的sql,我如何覆盖paginate()来对我的结果进行分页?

说明

我尝试进行自定义查询分页。 Controller获取关键字并生成SQL,我想将SQL字符串传递给public function paginate(Model $model, $conditions, $fields, $order, $limi ...)函数,该函数在Model中被覆盖以运行此自定义查询。我怎样才能将SQL字符串传递给paginate函数。

有任何建议或暗示吗?

1 个答案:

答案 0 :(得分:2)

您问题的简短回答是,您无法通过此查询对数据进行分页 - 或者,在完全使用计算字段时。您可能已经注意到,数据(尤其是计算字段中的数据)不会以data - > Model - > variable数组格式返回蛋糕。相反,它作为索引数组返回。

为了实现你在CakePHP范围内尝试做的事情,我会使用普通的find来获取实际存储在表中的数据并编写一些Virtual Fields来进行你的计算正在找。然后,您可以根据虚拟字段进行分页:

  

由于虚拟字段在执行查找时的行为与常规字段非常相似,因此Controller :: paginate()也可以按虚拟字段排序。

相关问题