mirror of
https://gitee.com/fastadminnet/framework.git
synced 2026-07-01 20:52:48 +08:00
Update Bulk.php
This commit is contained in:
@@ -35,7 +35,6 @@ trait Bulk
|
||||
if (empty($data)) {
|
||||
$this->error = Lang::get('_DATA_TYPE_INVALID_');
|
||||
}
|
||||
|
||||
if($data !== true){
|
||||
//如不是提交操作,则进行数据处理和缓存累加
|
||||
$data = $this->_write_data($data,'insert');
|
||||
@@ -49,28 +48,21 @@ trait Bulk
|
||||
//得到默认的提交SQL数据长度,此设定根据数据库配置不同得到的性能结果会有差异
|
||||
//这个数字是否应该写死还是定义一个公共配置名称,需要核心组讨论
|
||||
//发现使用insertAll因为bind生成出来的语句比正常的要长不少.字段名+时间戳+序号,还有优化的余地
|
||||
if(isset($options['bulkSize'])){
|
||||
$bulkSize = $options['bulkSize'];
|
||||
}
|
||||
else{
|
||||
$bulkSize = 10000;
|
||||
}
|
||||
|
||||
$bulkSize = isset($options['bulkSize']) ? $options['bulkSize'] : 10000;
|
||||
//数据累计到一定量,则执行
|
||||
if($this->bulkAddSize>=10000 || ($data === true && !empty($this->bulkAddCache))){
|
||||
|
||||
$options = $this->_parseOptions($options);
|
||||
// 写入数据到数据库
|
||||
$result = $this->db->insertAll($this->bulkAddCache, $options,false);
|
||||
//清空插入缓存
|
||||
$this->bulkAddCache = [];
|
||||
//清空长度计数
|
||||
$this->bulkAddSize = 0;
|
||||
//触发了一个实际插入操作,返回成功或失败
|
||||
return (false !== $result);
|
||||
if($this->bulkAddSize < $bulkSize && ($data !== true || empty($this->bulkAddCache))){
|
||||
return true;
|
||||
}
|
||||
$options = $this->_parseOptions($options);
|
||||
// 写入数据到数据库
|
||||
$result = $this->db->insertAll($this->bulkAddCache, $options,false);
|
||||
//清空插入缓存
|
||||
$this->bulkAddCache = [];
|
||||
//清空长度计数
|
||||
$this->bulkAddSize = 0;
|
||||
//触发了一个实际插入操作,返回成功或失败
|
||||
return (false !== $result);
|
||||
//插入数据到缓存未导致任何触发
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* 批量更新操作
|
||||
@@ -105,53 +97,48 @@ trait Bulk
|
||||
$this->bulkSaveSize[$field] = 0;
|
||||
}
|
||||
//如果同一个记录的同一字段被多次更新
|
||||
if(isset($this->bulkSaveCache[$field][$data[$pk]])){
|
||||
//如果是自增自减操作
|
||||
$operator = '=';
|
||||
if(in_array(substr($field,-1,1),['+','-'])){
|
||||
$operator = substr($field,-1,1);
|
||||
}
|
||||
if($operator == '='){
|
||||
//如果是直接赋值,不能重复写入,因为不确定那个值是正确的
|
||||
throw new Exception('cannot repeat write in');
|
||||
}
|
||||
else{
|
||||
//在原有修改基础上再进行自增或自减操作
|
||||
$this->bulkSaveCache[$field][$data[$pk]] += ( $operator =='+' ? $val : - $val );
|
||||
}
|
||||
if(!isset($this->bulkSaveCache[$field][$data[$pk]])){
|
||||
//计算新增修改增加的SQL长度
|
||||
$this->bulkSaveCache[$field][$data[$pk]] = $val;
|
||||
$this->bulkSaveSize[$field] += strlen($val) + strlen($data[$pk]) * 2+14;
|
||||
continue;
|
||||
}
|
||||
//如果是自增自减操作
|
||||
$operator = '=';
|
||||
if(in_array(substr($field,-1,1),['+','-'])){
|
||||
$operator = substr($field,-1,1);
|
||||
}
|
||||
if($operator == '='){
|
||||
//如果是直接赋值,不能重复写入,因为不确定那个值是正确的
|
||||
throw new Exception('cannot repeat write in');
|
||||
}
|
||||
else{
|
||||
$this->bulkSaveCache[$field][$data[$pk]] = $val;
|
||||
//在原有修改基础上再进行自增或自减操作
|
||||
$this->bulkSaveCache[$field][$data[$pk]] += ( $operator =='+' ? $val : - $val );
|
||||
}
|
||||
//计算新增修改增加的SQL长度
|
||||
$this->bulkSaveSize[$field] += strlen($val)+strlen($pk)*2+14;
|
||||
}
|
||||
}
|
||||
if(isset($options['bulkSize'])){
|
||||
$bulkSize = $options['bulkSize'];
|
||||
}
|
||||
else{
|
||||
$bulkSize = 5000;
|
||||
}
|
||||
$bulkSize = isset($options['bulkSize']) ? $options['bulkSize'] : 10000;
|
||||
//扫描字段长度.看是否有需要先执行的
|
||||
foreach($this->bulkSaveSize as $field=>$size)
|
||||
{
|
||||
if($size >= $bulkSize || ($size>0 && $data === true)){
|
||||
//复制出插入数组
|
||||
$dataSet = $this->bulkSaveCache[$field];
|
||||
unset($this->bulkSaveCache[$field]);
|
||||
unset($this->bulkSaveSize[$field]);
|
||||
//默认运算符
|
||||
$operator='=';
|
||||
//自增或者自减
|
||||
if(in_array(substr($field,-1,1),['+','-']))
|
||||
{
|
||||
$operator = substr($field,-1,1);
|
||||
$field = substr($field,0,-1);
|
||||
}
|
||||
//批量字段更新
|
||||
$this->db->updateFieldAll($field,$pk,$dataSet,$operator,$options);
|
||||
if($size < $bulkSize && ($size== 0 || $data !== true)){
|
||||
continue;
|
||||
}
|
||||
//复制出插入数组
|
||||
$dataSet = $this->bulkSaveCache[$field];
|
||||
unset($this->bulkSaveCache[$field]);
|
||||
unset($this->bulkSaveSize[$field]);
|
||||
//默认运算符
|
||||
$operator='=';
|
||||
//自增或者自减
|
||||
if(in_array(substr($field,-1,1),['+','-']))
|
||||
{
|
||||
$operator = substr($field,-1,1);
|
||||
$field = substr($field,0,-1);
|
||||
}
|
||||
//批量字段更新
|
||||
$this->db->updateFieldAll($field,$pk,$dataSet,$operator,$options);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user