Chaque fois que vous rencontrez des problèmes de requête, vérifiez quelles requêtes sont réellement générées (par exemple en utilisant Kit de débogage ). À moins qu'il ne s'agisse d'un objet d'expression, le côté droit d'une condition sera toujours lié en tant que paramètre, c'est-à-dire que vous comparez à une chaîne littérale :
Pupils.school_id = 'Schools.id'
Généralement, pour une bonne compatibilité des guillemets automatiques, les noms de colonne doivent être des expressions d'identifiant. Alors que le côté gauche sera automatiquement géré correctement, le côté droit devra être géré manuellement.
Dans votre cas spécifique, vous pouvez facilement utiliser QueryExpression::equalFields()
, qui correspond exactement à ce que vous essayez de faire, en comparant les champs/colonnes :
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
return $exp->equalFields('Pupils.school_id', 'Schools.id');
})
Il est également possible de créer des expressions d'identifiant manuellement en les instanciant simplement :
->where([
'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])
ou depuis CakePHP 3.6 via le Query::identifier()
méthode :
->where([
'Pupils.school_id' => $query->identifier('Schools.id')
])
Et enfin, vous pouvez également toujours transmettre une seule valeur de chaîne, qui est essentiellement insérée dans la requête en tant que SQL brut, mais dans ce cas, les identifiants ne seront pas soumis à la citation automatique des identifiants :
->where([
'Pupils.school_id = Schools.id'
])
Voir aussi
- Livre de recettes > Accès à la base de données et ORM > Générateur de requêtes > Conditions avancées
- API> \Cake\ Database\Expression\QueryExpression::equalFields()
- API > \Cake\Database\ Expression\IdentifierExpression