当 - 如同在手册中 - 可以过滤给定变量。
$username = 'markstory';
$query = $articles->find()->matching('Comments.Users', function ($q) use ($username) {
return $q->where(['username' => $username]);
});
如何过滤其他包含值的值? 我认为下面的例子是可能的。但事实并非如此。
$query = $articles->find()->contain('Names')->matching('Comments.Users', function ($q) use ($username) {
return $q->where(['username' => Names.username]);
});
答案 0 :(得分:0)
仅适用于使用hasOne
策略的belongsTo
或join
关联的情况,否则该表将不会包含在主查询中。
Query::contain()
和Query::matching()
不能很好地协同工作,因为它们以固定顺序出现,即matching
联接将放在contain
加入之前,这使得使用不可能通过Query::matching()
回调条件。您可以使用Query::leftJoinWith()
或Query::innerJoinWith()
代替方法调用的顺序,或者将条件添加到主查询中。
您的字段比较是无效的PHP,但即使正确引用也无效,您必须将原始SQL代码段作为单个值传递,或者更好地通过表达式构建它,例如使用{ {1}}方法。
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');
});
});
另见