2017-09-25 6 views
0

Tentative de mise à jour de certaines lignes en fonction des données associées, en utilisant la correspondance. Mais seule la clause "where" fonctionne. Le "matching" est ignoré! Est-ce que je fais quelque chose de mal?Mise à jour de la requête en utilisant où et correspondant à Cakephp 3.X - est-ce possible?

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

Merci!

+0

Je pense que ce n'est pas possible. Quoi qu'il en soit quelles sont les relations entre vos modèles? Il semble que vous n'avez pas besoin d'une instruction correspondante si un 'TaskUser' appartient à Task ' – arilia

+0

Oui, TaskUsers appartient à Tâches. Comment est-ce que je pourrais mettre à jour un TaskUser avec l'état 4 ou 7, qui appartient à une tâche avec un type de tâche 1 ou 5, sans utiliser la correspondance, par exemple? – npena

Répondre

1

Il semble que la réponse à votre question est non, selon this numéro

Comme @ndm dit dans les commentaires, vous pouvez utiliser un sous-requête en fonction de votre SGBD

je ferais quelque chose comme ceci:

$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

Les jointures ne sont pas prises en charge, vous ne pouvez donc pas utiliser d'endiguement. Pour les requêtes de mise à jour avec des jointures, il faut écrire la requête complètement manuellement. Alternativement, l'utilisation de sous-requêtes peut être possible, ce qui a toutefois certaines limites en fonction du SGBD. – ndm

+0

@ndm oui, bien sûr, vous avez tout à fait raison. Je vais supprimer ou modifier ma réponse – arilia

+0

@arilia vous avez raison !! Merci! – npena