Siempre que encuentre problemas con las consultas, verifique qué consultas se están generando realmente (por ejemplo, usando Kit de depuración ). A menos que sea un objeto de expresión, el lado derecho de una condición siempre estará vinculado como un parámetro, es decir, está comparando con un literal de cadena:
Pupils.school_id = 'Schools.id'
En general, para una compatibilidad adecuada con las comillas automáticas, los nombres de las columnas deben ser expresiones de identificador. Mientras que el lado izquierdo se manejará correctamente automáticamente, el lado derecho deberá manejarse manualmente.
En su caso específico, podría utilizar fácilmente QueryExpression::equalFields()
, que es exactamente lo que está tratando de hacer, comparando campos/columnas:
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
También es posible crear expresiones de identificador manualmente con solo instanciarlas:
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
o a partir de CakePHP 3.6 a través de Query::identifier()
método:
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
Y, por último, también puede pasar siempre un único valor de cadena, que básicamente se inserta en la consulta como SQL sin procesar; sin embargo, en ese caso, los identificadores no estarán sujetos a las comillas automáticas de identificadores:
->where([
'Pupils.school_id = Schools.id'
])
Véase también
- Recetario> Acceso a la base de datos y ORM> Generador de consultas> Condiciones avanzadas
- API> \Cake\ Base de datos\Expresión\QueryExpression::equalFields()
- API> \Cake\Database\ Expresión\IdentificadorExpresión