Für eine, die nur im Falle eines hasOne
oder belongsTo
associtiation funktionieren würde, der die join
Strategie verwendet, sonst würde die Tabelle nicht in der Hauptabfrage enthalten sein.
Query::contain()
und Query::matching()
aber nicht gut zusammen spielen, weil sie in einer festen Reihenfolge angezeigt, dh matching
platziert wird beitritt vor contain
schließt sich, die Bedingungen über den unmöglich Query::matching()
Rückruf unter Verwendung macht. Sie werden entweder stattdessen Query::leftJoinWith()
oder Query::innerJoinWith()
verwenden, was die Reihenfolge der Methodenaufrufe berücksichtigt oder die Bedingungen zur Hauptabfrage hinzufügt.
Ihr Feldvergleich ist ungültig PHP, aber selbst wenn korrekt zitiert, das würde nicht funktionieren, müssten Sie entweder eine Raw SQL Snippet als einzelner Wert, oder besser noch über Ausdrücke, zum Beispiel mit der QueryExpression::equalFields()
Methode.
$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');
});
Siehe auch