对于一个只会在使用join
策略hasOne
或belongsTo
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');
});
参见
来源
2017-07-19 14:01:48
ndm