每当遇到查询问题时,请检查实际生成的查询(例如使用DebugKit)。除非是表达式对象,否则条件的右侧将始终绑定为参数,即与字符串文字进行比较:
Pupils.school_id = 'Schools.id'
通常为了正确的自动引用兼容性,列名应该是标识符表达式。虽然左侧将自动正确处理,但右侧则需要手动处理。
根据您的具体情况,您可以轻松利用QueryExpression::equalFields()
,这正是您想要做的事情,比较字段/列:
->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()
method:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
最后,您还可以始终传递单个字符串值,该值基本上作为原始 SQL 插入到查询中,但是在这种情况下,标识符将不受自动标识符引用的约束:
->where([
'Pupils.school_id = Schools.id'
])
See also
- Cookbook > 数据库访问和 ORM > 查询生成器 > 高级条件
- API > \Cake\Database\Expression\QueryExpression::equalFields()
- API > \Cake\Database\Expression\IdentifierExpression