CakePHP 查询生成器和计数语法

CakePHP Querybuilder & Count Syntax

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

这里是简化代码:

$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?

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

还有比这更好的解决办法吗?

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

  • 您获得 table 定位器(需要步骤)
  • 你得到了table(需要的步骤)
  • 您需要加载数据(需要的步骤)
  • 你需要调用一个函数(需要步骤)
  • 你调用那个计数函数(需要步骤)

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

$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('*')
])