Sempre que encontrar problemas de consulta, verifique quais consultas estão realmente sendo geradas (por exemplo, usando DebugKit ). A menos que seja um objeto de expressão, o lado direito de uma condição sempre será vinculado como um parâmetro, ou seja, você está comparando com um literal de string:
Pupils.school_id = 'Schools.id'
Geralmente, para compatibilidade de citação automática adequada, os nomes das colunas devem ser expressões de identificador. Enquanto o lado esquerdo será automaticamente manuseado corretamente, o lado direito precisaria ser manuseado manualmente.
No seu caso específico, você pode facilmente utilizar
QueryExpression::equalFields()
, que é exatamente o que você está tentando fazer, comparando campos/colunas:->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
Também é possível criar expressões identificadoras manualmente simplesmente instanciando-as:
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
ou a partir do CakePHP 3.6 através do
Query::identifier()
método:->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
E, finalmente, você também pode sempre passar um único valor de string, que é basicamente inserido na consulta como SQL bruto, no entanto, nesse caso, os identificadores não estarão sujeitos à citação automática de identificadores:
->where([
'Pupils.school_id = Schools.id'
])
Veja também
- Livro de receitas> Acesso ao banco de dados e ORM> Construtor de consultas> Condições avançadas
- API> \Cake\ Banco de dados\Expressão\QueryExpression::equalFields()
- API> \Cake\Database\ Expressão\IdentificadorExpressão