Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como comparar dois campos/colunas em uma condição?


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