如何使用 CakePHP ORM 查询 belongsToMany 关系

How to use CakePHP ORM to query belongsToMany relationship

我正在开发支持基于 CakePHP 3 的自定义查询生成器代码 API。我最近收到一个请求,要求它针对关联用户的任务项进行搜索。

Task 到用户的关联是 belongsToMany,到目前为止,自定义查询功能还不支持它。在 TasksTable.php:

中的关系看起来像这样
<?php

$this->belongsToMany('Users', [
    'foreignKey' => 'task_id',
    'targetForeignKey' => 'user_id',
    'through' => 'TasksUsers'
]);

查询构建器使用 Cake\Database\Expression\QueryExpression 来执行查询,因为它必须处理比我使用 Cake\Database\Query 能够处理的更复杂的查询。但是,我现在正在尝试嵌套一个 QueryExpression 来处理对这个 belongsToMany 关系的用户查询。

代码非常抽象。为了简单起见,我将 TasksTable 上 Search\Model\Filter\Base 的实现简化为以下代码。这恰恰说明了我在 运行 时正在处理的问题。

<?php

public function process(): bool
{
    $this->getQuery()->where(function (QueryExpression $exp, Query $query) {
        return $query->newExpr()->eq('Users.id', 621048);
    })->contains('Users');
}

以上给出了我:

"SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Users' in 'where clause'"

我想知道如何修改 where 子句中嵌套函数的 return 和 contains 的内容以完成对 Users 的 belongToMany 关系的连接?

附带说明一下,我知道示例查询可以使用针对查询的 matching() 方法执行,如 here 所示。然而,这对我的解决方案不起作用,因为自定义搜索中的所有内容都必须使用 QueryExpressions 检查以与查询构建器的其余部分兼容。

提前感谢您的意见!

正如评论中所指出的那样,我的问题的解决方案是在查询中添加一个 leftJoinsWith(),而不是 contains():

<?php

public function process(): bool
{
    $this->getQuery()->where(function (QueryExpression $exp, Query $query) {
        return $query->newExpr()->eq('Users.id', 621048);
    })->leftJoinWith('Users');
}

QueryExpressions 用于检查条件而不是连接数据。

可以找到有关使用 leftJoinWith() 的更多信息 here