注意:我最初在一个小时前问过这个问题,但直到最近才意识到我犯了一个重大的复制和粘贴错误。一个如此重要,以至于更容易删除旧帖并重新开始。对此感到抱歉。
在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'
,更不用说为什么它被召唤两次了。有没有人知道发生了什么?谢谢你的帮助。
答案 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”必须是主键或“唯一”索引,因此它知道触发更新。