CakePHP 查询调用 COUNT() 两次,没有明显的原因


A CakePHP query calls COUNT() twice for no apparent reason

注意:我最初在大约一个小时前问过这个问题,但直到最近才意识到我犯了一个重大的复制和粘贴错误。一个如此重要,以至于删除旧帖子并重新开始更容易。对此感到抱歉。

在 CakePHP 框架中,在我更新模型后,我转储了 SQL 查询。 COUNT(*)被叫了两次,没有明显的原因。

所以我有两个模型,$Foo$Bar。为简单起见,我没有定义它们之间的任何$belongsTo$hasMany关系。该问题仅涉及$Foo,但以防万一我也包含了$Bar的代码。

$data = array(
    'something' => 12,
    'something_else' => $this->Bar->field('id', $conditions),
);
$this->Foo->id = $this->Foo->field($data);
$this->Foo->save($data);

我根据一组条件(此处无关)获取$Bar.id字段。我使用该 id 来确定应该插入或更新$Foo $data。如果$Foo有一个满足$data要求的 id,则将返回该值;如果不是的,将被退回。根据 CakePHP 的架构,如果有有效的 id,save() 将更新;否则它将插入。我很确定我没有做任何不寻常的事情。

这是我在 SQL 转储中看到的内容:

SELECT `Foo`.`id` FROM `foos` AS `Foo` WHERE `something` = 12 AND `something_else` = 1 LIMIT 1
SELECT COUNT(*) AS `count` FROM `foos` AS `Foo` WHERE `Foo`.`id` = 1
SELECT COUNT(*) AS `count` FROM `foos` AS `Foo` WHERE `Foo`.`id` = 1
UPDATE `foos` SET `something` = 12, something_else` = 1 WHERE `foos`.`id` = 1'

对于我的生活,我根本无法弄清楚为什么需要COUNT(),更不用说为什么它被称为两次了。有人知道发生了什么吗?感谢您的帮助。

我没有使用过 CakePHP,但查看这里的源代码,您会在字段函数中看到它调用了 find 方法。

因此,此调用

$data = array(
    'something' => 12,
    'something_else' => $this->Bar->field('id', $conditions),
);

生成:

SELECT `Foo`.`id` FROM `foos` AS `Foo` WHERE `something` = 12 AND `something_else` = 1     LIMIT 1

然后设置字段调用

$this->Foo->id = $this->Foo->field($data);

通过内部查找函数调用生成此函数:

SELECT COUNT(*) AS `count` FROM `foos` AS `Foo` WHERE `Foo`.`id` = 1

Save 函数还会调用 find 以查看记录在保存之前是否存在,这会生成第二次调用:

SELECT COUNT(*) AS `count` FROM `foos` AS `Foo` WHERE `Foo`.`id` = 1

最后一个查询是明显的保存本身。

请自己寻找以验证我是否正确阅读了它,但这就是它似乎的作用。

无法告诉您发生了什么(因为我认为没有足够的代码),但可以为您提供解决方法。

使用"插入到表(id,字段,字段2)值(id,值,值2

)在重复键更新字段=值,字段2=值2"语法进行查询。

这允许 SQL 检查重复项,并且还将照亮您检查行是否存在和尝试插入之间的秒数部分(以防万一检查后插入另一个进程)。为此,字段"id"必须是主键或"唯一"索引,以便它知道触发更新。