MultipUpdate.php 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <?php namespace App\Models\Traits;
  2. use Illuminate\Support\Facades\DB;
  3. /**
  4. * 更新多条数据
  5. *
  6. */
  7. Trait MultipUpdate
  8. {
  9. /**
  10. * 多条更新
  11. *
  12. * @param array $multipValues 批量修改数据
  13. *
  14. */
  15. public function updateBatch($multipValues){
  16. // 如果没有数据,结束
  17. if( empty($multipValues) ) return 0;
  18. // 获取当前的表名
  19. $tableName = DB::getTablePrefix().$this->getTable();
  20. // 获取第一条数据
  21. $firstRow = current($multipValues);
  22. // 需要更新的字段
  23. $updateColumn = array_keys($firstRow);
  24. // 更新条件字段, 默认以 id 为更新条件,没有ID以第一个字段为条件
  25. $mapColumn = in_array('id',$updateColumn) ? 'id' : current($updateColumn);
  26. // 更新条件字段在更新字段列表中的下标
  27. $i = array_search($mapColumn,$updateColumn);
  28. // 删除更新的字段
  29. if( $i !== false ) unset($updateColumn[$i]);
  30. // 每个字段的case语句
  31. $caseList = [];
  32. // 更新条件字段值
  33. $whereIns = [];
  34. // 循环更新字段
  35. foreach ($updateColumn as $column) {
  36. // 每个字段一个CASE语句
  37. $caseSql = '`'.$column.'` = CASE ';
  38. // 循环传入的批量修改数据
  39. foreach ($multipValues as $data) {
  40. // 当更新条件字段对应值时,返回对应的数据
  41. $caseSql .= "WHEN `{$mapColumn}` = '{$data[$mapColumn]}' THEN '{$data[$column]}' ";
  42. // 获取更新条件字段的值
  43. $whereIns[] = "'{$data[$mapColumn]}'";
  44. }
  45. // 结束CASE语句
  46. $caseSql .= 'ELSE `'.$column.'` END ';
  47. // 追加CASE列表
  48. $caseList[] = $caseSql;
  49. }
  50. // 组装修改语句
  51. $updateSql = 'UPDATE `'.$tableName.'` SET ' . implode(',',$caseList) . ' WHERE `'.$mapColumn.'` IN('.implode(',',$whereIns).');';
  52. // 预处理SQL,绑定参数,返回结果
  53. return DB::update($updateSql);
  54. }
  55. }