2017-09-25 101 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