php - CakePHP 查询调用 COUNT() 两次,原因不明

标签 php mysql cakephp cakephp-model

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

在 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/

相关文章:

php - 无法烘烤 CakePHP - 为蛋糕/控制台/蛋糕设置 chmod +x 时权限被拒绝 - 在 NTFS 安装分区上

JavaScript 按类型和大小对变量进行验证

php - 保护与 PHP 应用程序集成的 Node.js 应用程序

javascript - 连接到数据库时不显示 Google map

html - Cakephp 2.5 和剥离 HTML

url - cakephp:如何将语言文件夹添加到 url?

php artisan 迁移抛出 PDOException

PHP:分配新的 PDO 作为对象属性

asp.net - 无需在系统上安装 MySQL ODBC 5.1 驱动程序即可运行 .net 网站

php - "Registration-form"创建多个用户