クエリの問題が発生した場合は、実際に生成されているクエリを確認してください(たとえば、 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')
])
またはQuery::identifier()
を介したCakePHP3.6以降 方法:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
そして最後に、常に単一の文字列値を渡すこともできます。これは基本的に生のSQLとしてクエリに挿入されますが、その場合、識別子は自動識別子引用の対象にはなりません。
->where([
'Pupils.school_id = Schools.id'
])
も参照してください
- クックブック>データベースアクセスとORM>クエリビルダー>高度な条件
- API> \ Cake \ Database \ Expression \ QueryExpression ::equalFields()
- API> \ Cake \ Database \ Expression \ IdentifierExpression