2017-09-25 74 views
0

尝试使用匹配根据相关数据更新某些行。 但只有“where”子句正在工作。 “匹配”被忽略!更新查询使用的地方和匹配Cakephp 3.X - 有可能吗?

我,做错了什么?

$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(); 

谢谢!!

+0

我认为这是不可能的。无论如何,你的模型之间有什么关系?似乎你不需要一个匹配的语句,如果一个'TaskUser'属于'Task' – arilia

+0

是的,TaskUsers属于任务。例如,我怎样才能更新状态为4或7的TaskUser,属于具有task_type为1或5的任务,而不使用匹配? – npena

回答

1

看来这个问题的答案是否定的,根据this问题

正如@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 
    ]) 
}); 
+1

连接不受支持,因此您也不能使用遏制。对于使用连接的更新查询,必须手动完成查询。另外,使用子查询也是可能的,但是也有一些限制,这取决于DBMS。 – ndm

+0

@ndm是的,当然你是完全正确的。我会删除或编辑我的答案 – arilia

+0

@arilia你是对的!谢谢! – npena