如何比较一个条件下的两个fields/columns?
How to compare two fields/columns in a condition?
我很难弄清楚如何让子查询工作。
假设我有:
$schools
->select($this->Schools)
->select([
'pupilcount' => $this->Pupils
->find()
->select([
$this->Pupils->find()->func()->count('*')
])
->where([
'Pupils.school_id' => 'Schools.id',
]),
我遇到的问题(我认为)是 Schools.id
始终为 0,因此计数 returned 为 0。我可以拉出 Pupils 连接,它会在那里显示 Pupils .
我尝试更改我的代码以添加:
->select(['SCID' => 'Schools.id'])
并在子查询中引用但不起作用,它总是 return 0 对于 pupilcount
。
我做错了什么?
每当遇到查询问题时,请检查实际生成了哪些查询(例如使用 DebugKit)。除非是表达式对象,否则条件的右侧将始终作为参数绑定,即您正在与字符串文字进行比较:
Pupils.school_id = 'Schools.id'
通常为了适当的自动引用兼容性,列名应该是标识符表达式。虽然左侧会自动正确处理,但右侧需要手动处理。
在您的特定情况下,您可以轻松利用 QueryExpression::equalFields()
,这正是您想要做的事情,比较 fields/columns:
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
也可以通过简单地实例化来手动创建标识符表达式:
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
或从 CakePHP 3.6 开始通过 Query::identifier()
方法:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
最后,您还可以始终传递单个字符串值,该字符串值基本上作为原始 SQL 插入到查询中,但是在这种情况下,标识符将不受自动标识符引用的影响:
->where([
'Pupils.school_id = Schools.id'
])
另见
我很难弄清楚如何让子查询工作。
假设我有:
$schools
->select($this->Schools)
->select([
'pupilcount' => $this->Pupils
->find()
->select([
$this->Pupils->find()->func()->count('*')
])
->where([
'Pupils.school_id' => 'Schools.id',
]),
我遇到的问题(我认为)是 Schools.id
始终为 0,因此计数 returned 为 0。我可以拉出 Pupils 连接,它会在那里显示 Pupils .
我尝试更改我的代码以添加:
->select(['SCID' => 'Schools.id'])
并在子查询中引用但不起作用,它总是 return 0 对于 pupilcount
。
我做错了什么?
每当遇到查询问题时,请检查实际生成了哪些查询(例如使用 DebugKit)。除非是表达式对象,否则条件的右侧将始终作为参数绑定,即您正在与字符串文字进行比较:
Pupils.school_id = 'Schools.id'
通常为了适当的自动引用兼容性,列名应该是标识符表达式。虽然左侧会自动正确处理,但右侧需要手动处理。
在您的特定情况下,您可以轻松利用 QueryExpression::equalFields()
,这正是您想要做的事情,比较 fields/columns:
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
也可以通过简单地实例化来手动创建标识符表达式:
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
或从 CakePHP 3.6 开始通过 Query::identifier()
方法:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
最后,您还可以始终传递单个字符串值,该字符串值基本上作为原始 SQL 插入到查询中,但是在这种情况下,标识符将不受自动标识符引用的影响:
->where([
'Pupils.school_id = Schools.id'
])
另见