如何使用 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。
我正在开发支持基于 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。