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

注意:我最初是在一个小时前问这个问题,但直到最近才意识到我犯了一个严重的复制粘贴错误.如此重要,以至于删除旧帖子并重新开始比较容易.对于那个很抱歉.

在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的ID满足$data的要求,则将返回该值;如果不是false,将返回.根据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,但查看源代码here,您将在field函数中看到该函数调用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

最后的查询是显而易见的保存本身.

请自行检查以确保我阅读正确,但这似乎是正确的.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...