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

时间:2012-06-21 00:16:11

标签: php mysql cakephp cakephp-appmodel

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

在CakePHP框架中,在我更新了Model之后,我转储了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来确定应该插入或更新为$data的{​​{1}}。如果$Foo的ID符合$Foo的要求,则会返回该值;如果不是 false 将被退回。根据CakePHP的架构,$data将更新,如果有一个有效的ID;否则它会INSERT。我很确定我没有做任何不寻常的事情。

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

save()

对于我的生活,我无法弄清楚为什么需要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' ,更不用说为什么它被召唤两次了。有没有人知道发生了什么?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

我没有使用过CakePHP,但是查看源代码here,你会在字段函数中看到它调用了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

保存功能还会在保存之前调用查找以查看记录是否存在,从而生成第二个调用:

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

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

请自己去核实我是否正确阅读,但这就是它的表现。

答案 1 :(得分:0)

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

使用“INSERT INTO表(id,field,field2)VALUES(id,value,value2)ON DUPLICATE KEY UPDATE field = value,field2 = value2”语法来进行查询。

这允许SQL检查重复项,并且还会在检查存在的行和尝试插入之间消除那些小数秒(以防在检查后插入另一个进程)。为此,字段“id”必须是主键或“唯一”索引,因此它知道触发更新。