1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- <?php namespace App\Models\Traits;
- use Illuminate\Support\Facades\DB;
- /**
- * 更新多条数据
- *
- */
- Trait MultipUpdate
- {
- /**
- * 多条更新
- *
- * @param array $multipValues 批量修改数据
- *
- */
- public function updateBatch($multipValues){
- // 如果没有数据,结束
- if( empty($multipValues) ) return 0;
- // 获取当前的表名
- $tableName = DB::getTablePrefix().$this->getTable();
- // 获取第一条数据
- $firstRow = current($multipValues);
- // 需要更新的字段
- $updateColumn = array_keys($firstRow);
- // 更新条件字段, 默认以 id 为更新条件,没有ID以第一个字段为条件
- $mapColumn = in_array('id',$updateColumn) ? 'id' : current($updateColumn);
- // 更新条件字段在更新字段列表中的下标
- $i = array_search($mapColumn,$updateColumn);
- // 删除更新的字段
- if( $i !== false ) unset($updateColumn[$i]);
- // 每个字段的case语句
- $caseList = [];
- // 更新条件字段值
- $whereIns = [];
- // 循环更新字段
- foreach ($updateColumn as $column) {
- // 每个字段一个CASE语句
- $caseSql = '`'.$column.'` = CASE ';
- // 循环传入的批量修改数据
- foreach ($multipValues as $data) {
- // 当更新条件字段对应值时,返回对应的数据
- $caseSql .= "WHEN `{$mapColumn}` = '{$data[$mapColumn]}' THEN '{$data[$column]}' ";
- // 获取更新条件字段的值
- $whereIns[] = "'{$data[$mapColumn]}'";
- }
- // 结束CASE语句
- $caseSql .= 'ELSE `'.$column.'` END ';
- // 追加CASE列表
- $caseList[] = $caseSql;
- }
- // 组装修改语句
- $updateSql = 'UPDATE `'.$tableName.'` SET ' . implode(',',$caseList) . ' WHERE `'.$mapColumn.'` IN('.implode(',',$whereIns).');';
- // 预处理SQL,绑定参数,返回结果
- return DB::update($updateSql);
- }
- }
|