Pour un qui ne fonctionne que dans le cas d'un hasOne
ou belongsTo
associtiation qui utilise la stratégie join
, sinon la table ne seraient pas inclus dans la requête principale.
Query::contain()
et Query::matching()
mais ne jouent pas bien ensemble parce qu'ils apparaissent dans un ordre fixe, qui est matching
joint sera placé avant contain
joint, ce qui rend l'utilisation de conditions via l'impossible rappel Query::matching()
. À la place, vous devrez utiliser Query::leftJoinWith()
ou Query::innerJoinWith()
, qui respecte l'ordre des appels de méthode ou ajouter les conditions à la requête principale. Votre comparaison de champs n'est pas valide PHP, mais même lorsqu'elle est citée correctement cela ne fonctionnerait pas, vous devrez soit passer un extrait de code SQL brut en tant que valeur unique, ou mieux encore le construire via des expressions, par exemple en utilisant le QueryExpression::equalFields()
méthode.
$query = $articles
->find()
->innerJoinWith('Names')
->matching('Comments.Users', function (\Cake\ORM\Query $q) use ($username) {
return $q->where(function (\Cake\Database\Expression\QueryExpression $exp) {
return $exp->equalFields('Users.username', 'Names.username');
});
});
// only works in case `Names` is a `hasOne` or `belongsTo` association
$query = $articles
->find()
->contain('Names')
->matching('Comments.Users')
->where(function (\Cake\Database\Expression\QueryExpression $exp) {
return $exp->equalFields('Users.username', 'Names.username');
});
Voir aussi