Base.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <?php
  2. namespace App\Models;
  3. use DB;
  4. use Artisan;
  5. use Illuminate\Database\Eloquent\Model;
  6. use Illuminate\Database\Eloquent\SoftDeletes;
  7. class Base extends Model
  8. {
  9. // 软删除
  10. use SoftDeletes;
  11. /**
  12. * 禁止被批量赋值的字段
  13. *
  14. * @var array
  15. */
  16. protected $guarded = [];
  17. /**
  18. * 添加数据
  19. *
  20. * @param array $data 需要添加的数据
  21. * @return bool 是否成功
  22. */
  23. public function storeData($data)
  24. {
  25. //添加数据
  26. $result=$this
  27. ->create($data)
  28. ->id;
  29. if ($result) {
  30. flash_message('添加成功');
  31. return $result;
  32. }else{
  33. return false;
  34. }
  35. }
  36. /**
  37. * 修改数据
  38. *
  39. * @param array $map where条件
  40. * @param array $data 需要修改的数据
  41. * @return bool 是否成功
  42. */
  43. public function updateData($map, $data)
  44. {
  45. $model = $this
  46. ->whereMap($map)
  47. ->withTrashed()
  48. ->get();
  49. // 可能有查不到数据的情况
  50. if ($model->isEmpty()) {
  51. flash_message('无需要添加的数据', false);
  52. return false;
  53. }
  54. foreach ($model as $k => $v) {
  55. $result = $v->forceFill($data)->save();
  56. }
  57. if ($result) {
  58. flash_message('修改成功');
  59. return $result;
  60. }else{
  61. return false;
  62. }
  63. }
  64. /**
  65. * 删除数据
  66. *
  67. * @param array $map where 条件数组形式
  68. * @return bool 是否成功
  69. */
  70. public function destroyData($map)
  71. {
  72. //软删除
  73. $result=$this
  74. ->where($map)
  75. ->delete();
  76. if ($result) {
  77. flash_message('操作成功');
  78. return $result;
  79. }else{
  80. return false;
  81. }
  82. }
  83. /**
  84. * 恢复数据
  85. *
  86. * @param $map
  87. *
  88. * @return bool
  89. */
  90. public function restoreData($map)
  91. {
  92. // 恢复
  93. $result=$this
  94. ->where($map)
  95. ->restore();
  96. if ($result) {
  97. flash_message('操作成功');
  98. return $result;
  99. }else{
  100. return false;
  101. }
  102. }
  103. /**
  104. * 使用作用域扩展 Builder 链式操作
  105. *
  106. * 示例:
  107. * $map = [
  108. * 'id' => ['in', [1,2,3]],
  109. * 'category_id' => ['<>', 9],
  110. * 'tag_id' => 10
  111. * ]
  112. *
  113. * @param $query
  114. * @param $map
  115. * @return mixed
  116. */
  117. public function scopeWhereMap($query, $map)
  118. {
  119. // 如果是空直接返回
  120. if (empty($map)) {
  121. return $query;
  122. }
  123. // 判断各种方法
  124. foreach ($map as $k => $v) {
  125. if (is_array($v)) {
  126. $sign = strtolower($v[0]);
  127. switch ($sign) {
  128. case 'in':
  129. $query->whereIn($k, $v[1]);
  130. break;
  131. case 'notin':
  132. $query->whereNotIn($k, $v[1]);
  133. break;
  134. case 'between':
  135. $query->whereBetween($k, $v[1]);
  136. break;
  137. case 'notbetween':
  138. $query->whereNotBetween($k, $v[1]);
  139. break;
  140. case 'null':
  141. $query->whereNull($k);
  142. break;
  143. case 'notnull':
  144. $query->whereNotNull($k);
  145. break;
  146. case '=':
  147. case '>':
  148. case '<':
  149. case '<>':
  150. case 'like':
  151. $query->where($k, $sign, $v[1]);
  152. break;
  153. }
  154. } else {
  155. $query->where($k, $v);
  156. }
  157. }
  158. return $query;
  159. }
  160. /**
  161. * 批量更新的方法
  162. * 示例参数
  163. * $multipleData = [
  164. * [
  165. * 'name' => 'name 1' ,
  166. * 'date' => 'date 1'
  167. * ],
  168. * [
  169. * 'name' => 'name 2' ,
  170. * 'date' => 'date 2'
  171. * ]
  172. * ]
  173. *
  174. * @param array $multipleData
  175. * @return bool|int
  176. */
  177. function updateBatch($multipleData = []){
  178. if (empty($multipleData)) {
  179. return false;
  180. }
  181. // 获取表名
  182. $tableName = config('database.connections.mysql.prefix').$this->getTable();
  183. $updateColumn = array_keys($multipleData[0]);
  184. $referenceColumn = $updateColumn[0];
  185. unset($updateColumn[0]);
  186. $whereIn = "";
  187. // 组合sql语句
  188. $sql = "UPDATE ".$tableName." SET ";
  189. foreach ( $updateColumn as $uColumn ) {
  190. $sql .= $uColumn." = CASE ";
  191. foreach( $multipleData as $data ) {
  192. $sql .= "WHEN ".$referenceColumn." = '".$data[$referenceColumn]."' THEN '".$data[$uColumn]."' ";
  193. }
  194. $sql .= "ELSE ".$uColumn." END, ";
  195. }
  196. foreach( $multipleData as $data ) {
  197. $whereIn .= "'".$data[$referenceColumn]."', ";
  198. }
  199. $sql = rtrim($sql, ", ")." WHERE ".$referenceColumn." IN (". rtrim($whereIn, ', ').")";
  200. // 更新
  201. $result = DB::update(DB::raw($sql));
  202. if ($result) {
  203. flash_message('添加成功');
  204. }
  205. return $result;
  206. }
  207. }