2017-07-19 86 views
0

當 - 像手冊一樣 - 可以過濾給定的變量。CakePHP 3.x - 如何通過另一個關聯的字段過濾一個關聯?

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

如何篩選來自其他包含值的值? 我想下面的例子是可能的。但事實並非如此。

​​

回答

0

對於一個只會在使用join策略hasOnebelongsTo associtiation的情況下工作,否則,表將不包括在主查詢。

Query::contain()Query::matching(),因爲它們出現在一個固定的順序卻沒有發揮好在一起,就是matching加入contain加入之前,這使得通過Query::matching()回調不可能使用條件將被放置。您可以使用Query::leftJoinWith()Query::innerJoinWith()來代替方法調用的順序,也可以將條件添加到主查詢中。

您的字段比較是無效的PHP,但即使正確引用不會奏效,您也必須將原始SQL片段作爲單個值傳遞,或者更好地通過表達式構建它,例如使用QueryExpression::equalFields()方法。

$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'); 
    }); 

參見