将 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
仅当您有多个连接会导致重复的连接行时才有必要。
另见
我有一个查询,需要公司名称及其员工数量。问题是我想通过某些条件(如 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
仅当您有多个连接会导致重复的连接行时才有必要。
另见