2017-07-19 3 views
0

Wenn - wie im Handbuch - kann man nach einer bestimmten Variablen filtern.CakePHP 3.x - Wie filtert man eine Assoziation nach Feldern einer anderen Assoziation?

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

Wie können Sie auf einen Wert von einem anderen Wert filtern filtern? Ich dachte, Beispiel wäre möglich. Aber es ist nicht.

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

Antwort

0

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

Verwandte Themen