2017-07-19 2 views
0

Lorsque - comme dans le manuel - on peut filtrer sur une variable donnée.CakePHP 3.x - Comment filtrer une association par champs d'une autre association?

$username = 'markstory'; 
$query = $articles->find()->matching('Comments.Users', function ($q) use ($username) { 
    return $q->where(['username' => $username]); 
}); 

Comment pouvez-vous filtrer sur une valeur d'une autre valeur de confinement? Je pensais que l'exemple ci-dessous serait possible. Mais ce n'est pas.

$query = $articles->find()->contain('Names')->matching('Comments.Users', function ($q) use ($username) { 
    return $q->where(['username' => Names.username]); 
}); 

Répondre

0

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