CakePHP 3.x - 如何按另一个关联的字段过滤一个关联?

时间:2017-07-19 11:42:50

标签: mysql cakephp associations cakephp-3.0 contain

当 - 如同在手册中 - 可以过滤给定变量。

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

1 个答案:

答案 0 :(得分:0)

仅适用于使用hasOne策略的belongsTojoin关联的情况,否则该表将不会包含在主查询中。

然而,

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

另见