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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我试图在使用CakePHP paginate()方法的SQL查询中使用“HAVING”子句。

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

我的代码看起来像这样:

$this->paginate = array(
        'fields' => $fields,
        'conditions' => $conditions,
        'recursive' => 1,
        'limit' => 10, 
        'order' => $order,
        'group' => 'Venue.id');

其中一个$字段是别名“距离”。我想为距离<25(例如HAVING距离<25)添加查询。

到目前为止,我已经看到了两种解决方法,遗憾的是,这些解决方案都不适合我的需求 我见过的两个是:

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

2)在WHERE条件之后添加HAVING子句(例如WHERE 1 = 1 HAVING field > 25)这不起作用,因为看起来HAVING子句必须出现 Cake发出的查询中的WHERE条件之后的组语句之后。

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

提问于
用户回答回答于

这个

$this->find('all', array(
    'conditions' => array(
        'Post.length >=' => 100
    ),
    'fields' => array(
        'Author.id', 'COUNT(*) as Total'
    ),
    'group' => array(
        'Total HAVING Total > 10'
    )
));

希望它可以帮助你

用户回答回答于

“dbo-> expression()”方法。

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;
}

扫码关注云+社区