将 where 子句添加到 cakephp 3 查询中的计算字段

Add where clause to calculated field in cakephp 3 query

我有一个查询,需要公司名称及其员工数量。问题是我想通过某些条件(如 employee_number > 50 等)过滤此结果。我的问题是,在构建查询时,我不知道如何过滤这个结果,因为条件是在一个计算字段上设置的,所以在应用条件时它给了我下面的

Error: `SQLSTATE[42S22]: Column not found: 1054 Unknown column 'employee_number' in 'where clause'`.

我一直在尝试不同的东西,但这是我目前拥有的:

$query = $this->Companies->find('all')->where($conditions)->contain(['Users']);
        

$query
   ->select(['Users.name',
   'Company.modified',
   'employee_number' => $query->func()->count('DISTINCT(Employees.id)')])
   ->where('employee_number >' => 50 )
   ->leftJoinWith('Employees', function (\Cake\ORM\Query $query) {
       return $query->where(['deleted' => 0]);
   })
   ->group(['Employees.company_id', 'Company.id']);

首先,你不能在 WHERE 子句中引用聚合,因为分组发生在之后,因此错误,字段 employee_number 在 [=12= 时不存在] 条件正在应用,您必须改为利用 HAVING 子句。

根据您使用的 DBMS,您可以引用 select 列表中的列,例如 MySQL 允许:

$query
    ->select([
        'Users.name',
        'Company.modified',
        'employee_number' => $query->func()->count('DISTINCT Employees.id')
    ])
    ->leftJoinWith('Employees', function (\Cake\ORM\Query $query) {
        return $query->where(['deleted' => 0]);
    })
    ->group(['Employees.company_id', 'Company.id'])
    ->having(['employee_number >' => 50]);

而 Postgres 则不会,并且要求您在 HAVING 子句中重复聚合:

->having(function (
    \Cake\Database\Expression\QueryExpression $exp,
    \Cake\ORM\Query $query
) {
    return $exp->gt($query->func()->count('DISTINCT Employees.id'), 50);
});

ps。使用 DISTINCT 仅当您有多个连接会导致重复的连接行时才有必要。

另见