如何在CakePHP 3中使用COUNT(*)和find('list')?

Pha*_*son 6 php cakephp cakephp-3.0

在CakePHP 3中,我有一个名为Articles的模型和一个名为'subject'的字段,我遇到了一个障碍,试图检索100个最常用的文章主题列表.

以下代码生成的SQL选择了所有可能的字段,而不是 COUNT(*):

$articles->find('list', [
    'keyField' => 'subject',
    'valueField' => 'COUNT(*)'
])
->group('subject')
->order(['COUNT(*)' => 'DESC'])
->limit(100)
->toArray();
Run Code Online (Sandbox Code Playgroud)

然后我记得"CakePHP的ORM为一些常用的SQL函数提供了抽象." .但是以下代码导致"错误:函数名称必须是字符串":

$countFunc = $this->find()->func()->count('*');
$articles->find('list', [
    'keyField' => 'subject',
    'valueField' => $countFunc
])
->group('subject')
->order([$countFunc => 'DESC'])
->limit(100)
->toArray();
Run Code Online (Sandbox Code Playgroud)

Pha*_*son 12

幸运的是,José向我倾斜了这个技巧,它就像一个魅力:

$articles->find('list', [
    'keyField' => 'subject',
    'valueField' => 'count'
])
->select([
    'subject',
    'count' => $this->find()->func()->count('*')
])
->group('subject')
->order(['count' => 'DESC'])
->limit(100)
->toArray();
Run Code Online (Sandbox Code Playgroud)