【问题标题】:Virtual fields and using HAVING in CakePHP虚拟字段和在 CakePHP 中使用 HAVING
【发布时间】:2013-04-02 06:32:16
【问题描述】:

我需要从 mysql 中找到那些具有唯一 test 字段的行。我尝试添加 virtualFields 以获取 test 的计数,然后按 test 字段分组并检查 test 必须等于 1。

以下是我的代码...它给出了错误:Syntax error or access violation

public function index()
{
    $this -> User -> virtualFields(array(
        'countTest' => "COUNT(User.test)"
    ));

    $users = $this -> User -> find('all', array(
        'conditions' => array('countTest' => 1),
        'group' => 'User.test'
    )); 

    pr($users); die;
}

我找到了解决问题的 MySql 查询:'SELECT test, COUNT(*) as count FROM users GROUP BY test HAVING COUNT(*) = 1';

你能把上面的查询转换成 CakePHP 格式吗?

【问题讨论】:

  • 请注意,'virtualFields' 不是一个方法,它是模型的一个属性;要添加虚拟字段,请使用:$this->User->virtualFields = array('countTest' => 'COUNT(User.test)');。在此处阅读文档:Virtual fields。然而,要将它用作HAVING 条件在CakePHP 中有点棘手,它必须附加到'GROUP BY' 子句。请参阅@icebreaker 提供的答案中的“组”键。

标签: php mysql cakephp


【解决方案1】:

这样的事情可以引导你找到正确的解决方案

$this->User->find('all', array(
    'fields' => array('User.test', 'COUNT(User.test) AS User__test_count'),
    'group' => array('User.test'),
    // or even cake style SQL injection :)
    // 'group' => array('User.test HAVING COUNT(*) = 1')
  ));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多