QueryService.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. namespace App\Services\common;
  3. use Carbon\Carbon;
  4. use App\Traits\ServiceAppAop;
  5. use Illuminate\Database\Eloquent\Builder;
  6. class QueryService
  7. {
  8. use ServiceAppAop;
  9. /**
  10. * parameter - query(sql) - special column description
  11. *
  12. * @param array $params
  13. * @param object $query
  14. * @param array $columnQueryRules
  15. * @param string $tableName
  16. * @return object
  17. */
  18. public function query(array $params,$query,array $columnQueryRules,$tableName = null)
  19. {
  20. if ($tableName) $tableName .= ".";
  21. foreach ($params as $param => $value){
  22. if ($param === 'paginate' || $param === 'page')continue;
  23. if (!$value || ($columnQueryRules[$param] ?? false))continue;
  24. $query = $query->where($tableName.$param,$value);
  25. }
  26. //rules: alias timeLimit startDate endDate like multi
  27. foreach ($columnQueryRules as $param => $rules){
  28. if (!($params[$param] ?? false) || !$params[$param])continue;
  29. $isExecute = true;
  30. $column = $param;
  31. foreach ($rules as $rule => $value){
  32. if ($rule === 'alias'){
  33. $column = $value;
  34. $isExecute = false;
  35. }
  36. if ($rule === 'timeLimit'){
  37. $today=Carbon::now()->subDays($value);
  38. $queryTemp=clone $query;
  39. $queryTemp=$queryTemp->where($tableName.$column,'like','%'.$params[$param].'%')
  40. ->where($tableName.'created_at','>',$today);
  41. if($queryTemp->count()==0 || $queryTemp->first()[$column]==$params[$param]){
  42. $query=$query->where($tableName.$column,"like",$params[$param]."%");
  43. }else{
  44. $query=$query->where($tableName.$column,'like','%'.$params[$param].'%')
  45. ->where($tableName.'created_at','>',$today);
  46. }
  47. $isExecute = true;
  48. }
  49. if ($rule === 'startDate'){
  50. $startDate = $params[$param].$value;
  51. $query = $query->where($tableName.$column,'>=',$startDate);
  52. $isExecute = true;
  53. }
  54. if ($rule === 'endDate'){
  55. $endDate = $params[$param].$value;
  56. $query = $query->where($tableName.$column,'<=',$endDate);
  57. $isExecute = true;
  58. }
  59. if ($rule === 'like'){
  60. $query = $query->where($tableName.$column,'like',$value.$params[$param].'%');
  61. $isExecute = true;
  62. }
  63. if ($rule === 'multi'){
  64. $query = $query->whereIn($tableName.$column,explode($value,$params[$param]));
  65. $isExecute = true;
  66. }
  67. if ($rule === 'batch'){
  68. if (strpos($value.$params[$param].$value, ',') || strpos($value.$params[$param].$value, ',') || strpos($value.$params[$param].$value, ' ')) {
  69. $arr = array_filter(preg_split('/[,, ]+/is', $value.$params[$param].$value));
  70. $query = $query->whereIn($tableName.$column, $arr);
  71. } else {
  72. $query = $query->where($tableName.$column,'like',$value.$params[$param].$value.'%');
  73. }
  74. $isExecute = true;
  75. }
  76. }
  77. if (!$isExecute) $query = $query->where($tableName.$column,$params[$param]);
  78. }
  79. return $query;
  80. }
  81. public function priceModelAuditOrRecoverQuery($isAudit, Builder $query, $ownerId, $ids, $notRelation = false)
  82. {
  83. $query = $query->whereNotNull("operation")->where("operation","!=","");
  84. if ($ownerId){
  85. if ($notRelation){
  86. if (is_array($ownerId))$query->whereIn("owner_id",$ownerId);
  87. else $query->where("owner_id",$ownerId);
  88. }else{
  89. $query->whereHas("owners",function ($query)use($ownerId){
  90. /** @var Builder $query */
  91. if (is_array($ownerId))$query->whereIn("id",$ownerId);
  92. else $query->where("id",$ownerId);
  93. });
  94. }
  95. }
  96. if ($ids){
  97. if (is_array($ids))$query->whereIn("id",$ids);
  98. else $query->where("id",$ids);
  99. }
  100. $delete = [];
  101. $update = [];
  102. if ($isAudit){
  103. foreach ($query->get() as $model){
  104. if ($model->operation == "D"){
  105. $delete[] = $model->id;
  106. continue;
  107. }
  108. if ($model->operation == "U" && $model->target_id)$delete[] = $model->target_id;
  109. $update[] = $model->id;
  110. }
  111. }else{
  112. foreach ($query->get() as $model){
  113. if ($model->operation == "D"){
  114. $update[] = $model->id;
  115. continue;
  116. }
  117. $delete[] = $model->id;
  118. }
  119. }
  120. return ["delete"=>$delete,"update"=>$update];
  121. }
  122. }