使用where更新查询并与Cakephp 3.X匹配-可能吗?

使用where更新查询并与Cakephp 3.X匹配-可能吗?,cakephp,join,sql-update,cakephp-3.0,query-builder,Cakephp,Join,Sql Update,Cakephp 3.0,Query Builder,正在尝试使用匹配根据相关数据更新某些行。 但只有“where”条款起作用。“匹配”被忽略 我做错什么了吗 $tbTU = TableRegistry::get('TaskUsers'); $query = $tbTU->query() ->where([ 'TaskUsers.service_order_id' => $so_id, 'TaskUsers.status IN' => [0, 4, 7, 9], ])

正在尝试使用匹配根据相关数据更新某些行。 但只有“where”条款起作用。“匹配”被忽略

我做错什么了吗

$tbTU = TableRegistry::get('TaskUsers');
$query = $tbTU->query()
    ->where([
        'TaskUsers.service_order_id' => $so_id,
        'TaskUsers.status IN' => [0, 4, 7, 9],
    ]) 
    ->contain(['Tasks'])
    ->matching('Tasks', function($q) {
        return $q->where([
            'Tasks.task_type IN' => [1, 4, 5]
        ]); 
    });

return $query
    ->update()
    ->set([
        'status' => 3,
        'user_id' => NULL,
        'modified' => Time::now()
    ])
    ->execute();

谢谢

问题的答案似乎是否定的

正如@ndm在注释中所说的,您可以根据DBMS使用子查询

我会这样做:

$subquery = $this->TaskUsers->Tasks->find()
    ->select(['id'])
    ->where(['Tasks.task_type IN' => [1, 4, 5]]);

$tbTU->query()
    ->where([
        'TaskUsers.service_order_id' => $so_id,
        'TaskUsers.status IN' => [0, 4, 7, 9],
        'TaskUsers.task_id IN' => $subquery
    ])
});

我认为这是不可能的。不管怎样,你的模型之间的关系是什么?如果
TaskUser
属于
Task
是,TaskUsers属于Tasks,则似乎不需要匹配语句。例如,如果不使用匹配,我如何更新状态为4或7的TaskUser,因为它属于任务类型为1或5的任务?不支持联接,因此也不能使用容器。对于使用联接的更新查询,必须完全手动编写查询。或者,也可以使用子查询,但这也有一定的限制,这取决于DBMS。@ndm是的,当然你是完全正确的。我将删除或编辑我的答案