【问题标题】:Updating query using where and matching with Cakephp 3.X - is it possible?使用 where 更新查询并与 Cakephp 3.X 匹配 - 有可能吗?
【发布时间】:2017-09-25 02:28:08
【问题描述】:

尝试根据相关数据更新一些行,使用匹配。 但只有“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();

谢谢!!

【问题讨论】:

  • 我认为这是不可能的。无论如何,您的模型之间的关系是什么?如果 TaskUser belongsTo Task 似乎你不需要匹配语句
  • 是的,TaskUsers 属于 Tasks。例如,如何在不使用匹配的情况下更新状态为 4 或 7、属于 task_type 1 或 5 的任务的 TaskUser?

标签: cakephp join sql-update cakephp-3.0 query-builder


【解决方案1】:

根据this问题,您的问题的答案似乎是否定的

正如@ndm 在 cmets 中所说,您可以根据您的 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
    ])
});

【讨论】:

  • 不支持联接,因此您也不能使用容器。对于带有连接的更新查询,必须完全手动编写查询。或者,也可以使用子查询,但也有一定的限制,具体取决于 DBMS。
  • @ndm 是的,你当然是完全正确的。我将删除或编辑我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多