首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >CakePHP:在使用find方法构建查询时,如何使用"HAVING“操作?

CakePHP:在使用find方法构建查询时,如何使用"HAVING“操作?
EN

Stack Overflow用户
提问于 2011-10-13 07:11:40
回答 5查看 17.9K关注 0票数 20

我正在尝试使用CakePHP paginate()方法在SQL查询中使用"HAVING“子句。

经过一番搜索,这看起来不能通过Cake的paginate()/find()方法来实现。

我的代码看起来像这样:

代码语言:javascript
复制
$this->paginate = array(
        'fields' => $fields,
        'conditions' => $conditions,
        'recursive' => 1,
        'limit' => 10, 
        'order' => $order,
        'group' => 'Venue.id');

其中一个距离是别名“$fields”。我想添加一个当距离< 25 (例如,距离< 25)时的查询。

到目前为止,我已经看到了两种变通方法,不幸的是,这两种方法都不适合我的需要。我看到的两个例子是:

1)在"group“选项中添加HAVING子句。例如'group' => 'Venue.id HAVING distance < 25'。当与分页一起使用时,这似乎不起作用,因为它会扰乱执行的初始计数查询。(ie尝试SELECT distinct(Venue.id HAVING distance < 25),这显然是无效的语法。

2)在WHERE条件之后添加HAVING子句(例如WHERE 1 = 1 HAVING field > 25)这不起作用,因为在它生成的查询中,HAVING子句似乎必须出现在组语句之后,而则放置在WHERE条件之后。

有没有人知道用CakePHP的find()方法可以做到这一点?我不想使用query(),因为这会涉及到大量的返工,还意味着我需要实现自己的分页逻辑!

提前感谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-13 20:48:33

你必须把它和团队的条件放在一起。像这样

代码语言:javascript
复制
$this->find('all', array(
    'conditions' => array(
        'Post.length >=' => 100
    ),
    'fields' => array(
        'Author.id', 'COUNT(*) as Total'
    ),
    'group' => array(
        'Total HAVING Total > 10'
    )
));

希望能对你有所帮助

票数 36
EN

Stack Overflow用户

发布于 2012-05-29 12:38:35

我使用以下技巧在WHERE子句的末尾添加了我自己的HAVING子句。蛋糕sub-query documentation中提到了"dbo->expression()“方法。

代码语言:javascript
复制
function addHaving(array $existingConditions, $havingClause) {
  $model = 'User';
  $db = $this->$model->getDataSource();

  // Two fun things at play here,
  // 1 - mysql doesn't allow you to use aliases in WHERE clause
  // 2 - Cake doesn't allow a HAVING clause separate from a GROUP BY
  // This expression should go last in the WHERE clause (following the last AND)
  $taut = count($existingConditions) > 0 ? '1 = 1' : '';
  $having = $db->expression("$taut HAVING $havingClause");

  $existingConditions[] = $having;

  return $existingConditions;
}
票数 1
EN

Stack Overflow用户

发布于 2012-05-20 12:38:09

只是遇到了同样的问题。我知道,不应该修改内部代码,但如果您打开PaginatorComponent并修改了第188行:

代码语言:javascript
复制
$count = $object->find('count', array_merge($parameters, $extra));

要这样做:

代码语言:javascript
复制
$count = $object->find(
             'count', 
             array_merge(array("fields" => $fields),$parameters, $extra)
         );

一切都会好起来的。您将能够将您的HAVING子句添加到'group‘中,计数(*)不会成为问题。

或者,生成命令行:

代码语言:javascript
复制
$count = $object->paginateCount($conditions, $recursive, $extra);

包含$fields的步骤

代码语言:javascript
复制
$count = $object->paginateCount($fields,$conditions, $recursive, $extra);

之后,您可以“覆盖”模型上的方法,并确保在find()中包含$fields,就是这样!,=P

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7747656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档