注意:我最初是在一个小时前问这个问题的,但直到最近才意识到我犯了一个重大的复制和粘贴错误。一个如此重要以至于删除旧帖子并重新开始更容易。对此感到抱歉。
在 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 的架构,save()
将在存在有效 id 时进行更新;否则它将插入。我很确定我没有做任何不寻常的事情。
这是我在 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 ,您会在字段函数中看到它调用了 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
然后set字段调用
$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
最后的查询显然是保存本身。
请自己检查以验证我是否正确阅读了它,但这就是它看起来所做的。
关于php - CakePHP 查询调用 COUNT() 两次,原因不明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11129947/