【问题标题】:CakePHP Querybuilder & Count SyntaxCakePHP Querybuilder & Count 语法
【发布时间】:2020-06-23 14:55:03
【问题描述】:

最近,我遇到了一个看似简单的任务,即在查询构建器语句中输出引用项目的相关计数。

这里是简化代码:

$data = TableRegistry::getTableLocator()->get('tableA')->find()
        ->select(
            [
                'tableA.term',
                'tableA.termkey',

                 'count(tableA.termkey)' //my first though was this...but it does not work
                 'count' => TableRegistry::getTableLocator()->get('tableA')->find()->func()->count('*') //ok
            ],

        )         
        ->join([
            ....
            ]
        ])
        ->where(
            ....
        )->group(
            ....
        )->order(
           ....     
        );

现在,经过一些文档查找,我终于找到了一个语法相当奇特的解决方案。

TableRegistry::getTableLocator()->get('tableA')->find()->func()->count('*') //ok, works so far..but do I need this all stuff for an simple count?

在查询构建器中使用计数函数真的是理想的方法吗?

还有比这更好的解决方案吗?

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

    您可以通过先初始化查询来消除一些冗余:

    $query = TableRegistry::getTableLocator()->get('tableA')->find();
    $query = $query->select([
        'tableA.term',
        'tableA.termkey',
        // $query is already a query object here, so you can call func on it directly
        'count' => $query->func()->count('*')
    ])
    

    【讨论】:

    • 确实对我来说看起来好多了,但我想知道 CakePHP ORMs 是否提供了像我在 Symfony QueryBuilder 中使用的这样简单的东西: $qr->select('COUNT()') 这是相当于这个语句 $qr->select($qr->expr()->count(''))。
    • 您可以编写更原始的查询而不是使用函数式方法,但它们不能以同样的方式保护您免受 SQL 注入攻击之类的攻击。
    【解决方案2】:

    让我们看看你在这里做什么:

    • 你得到了表格定位器(需要的步骤)
    • 你得到了桌子(需要的步骤)
    • 您需要加载数据(需要的步骤)
    • 你需要调用一个函数(需要的步骤)
    • 您调用该计数函数(需要步骤)

    【讨论】:

    • hmm... 我真的需要为 Count 调用函数吗?我不太确定.. Symfony QueryBuilder 使我能够以一种非常简单的方式完成它,而无需函数调用..
    • @ChristianFelix 你可能是指教义。在此示例中,stackoverflow.com/questions/9214471/… count 被称为 SQL 函数。因此,无论如何都需要调用 count ,但是在您的代码中 count() 可以通过调用 func()
    • 实际上我的意思是 dql 不是教义...在您指出的示例中,有一个调用: $qb->select('count(account.id).. 我想使用它。 ..但我无法将这种方法应用于 cakephp ..所以问题仍然存在。由于某些可移植性问题,cakephp 通常会禁止此类声明,还是我此时只是遗漏了一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多