2017-07-19 30 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'); 
    }); 

参见