thinkphp5 模型多次save操作,会产生重复的主键ID
在thinkphp5.0.7版本下使用,如果用模型多次执行save操作,会提示产生的主键ID重复。代码如下
$FbPostImageModel = new FbPostImage();
for ($i=0; $i < 10; $i++) {
$data["object_id"] = rand(0, 10000);
$data["picture"] = "test";
$data["images"] = "test";
$data["link"] = "abc";
$data["caption"] = "";
$FbPostImageModel->isUpdate(false)->save($data);
}
异常提示:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry "17" for key "PRIMARY"
// 调试结束
$this->debug(false);
$this->numRows = $this->PDOStatement->rowCount();
return $this->numRows;
} catch (PDOException $e) {
if ($this->config["break_reconnect"] && $this->isBreak($e)) {
return $this->close()->execute($sql, $bind);
}
throw new PDOException($e, $this->config, $this->getLastsql());
}
}
/**
* 根据参数绑定组装最终的SQL语句 便于调试
* @access public
* @param string $sql 带参数绑定的sql语句
* @param array $bind 参数绑定列表
* @return string
Call Stack
in Connection.php line 457
at Connection->execute("INSERT INTO `fb_post...", ["__data__object_id" => [731, 2], "__data__picture" => ["test", 2], "__data__images" => [""test"", 2], ...]) in Query.php line 239
at Query->execute("INSERT INTO `fb_post...", ["__data__object_id" => [731, 2], "__data__picture" => ["test", 2], "__data__images" => [""test"", 2], ...]) in Query.php line 2062
at Query->insert(["object_id" => 731, "picture" => "test", "images" => ""test"", ...]) in Model.php line 934
at Model->save(["object_id" => 731, "picture" => "test", "images" => "test", ...]) in Index.php line 40
at Index->testMultiInsert()
at ReflectionMethod->invokeArgs(object(Index), []) in App.php line 224
at App::invokeMethod([object(Index), "testmultiinsert"], []) in App.php line 389
at App::module(["Index", "index", "testMultiInsert"], ["app_namespace" => "app", "app_debug" => true, "app_trace" => false, ...], null) in App.php line 130
at App::run() in start.php line 18
at require("/home/web/facebook_p...") in index.php line 20
生成的sql是:
INSERT INTO `fb_post_image` (`object_id` , `picture` , `images` , `link` , `caption` , `update_time`) VALUES ("8822" , "test" , ""test"" , "abc" , "" , "2017-03-09 14:47:40")
这里的17是自增主键ID。为了避免这个问题,需要将新增代码改成
$FbPostImageModel->isUpdate(false)->data($data, true)->save();
生成的sql是
INSERT INTO `fb_post_image` (`object_id` , `picture` , `images` , `link` , `caption` , `update_time`) VALUES ("7774" , "test" , ""test"" , "abc" , "" , "2017-03-09 14:48:49")
这可能是thinkphp的bug。
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: tp5与tp3的区别
- 下一篇: TP3.2的URL忽略大小写配置导致找不到模板