QueryService.php 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <?php
  2. namespace App\Services\common;
  3. use Carbon\Carbon;
  4. use Illuminate\Http\Request;
  5. use App\Traits\ServiceAppAop;
  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].$value.'%');
  61. $isExecute = true;
  62. }
  63. if ($rule === 'multi'){
  64. $query = $query->whereIn($tableName.$column,explode($value,$params[$param]));
  65. $isExecute = true;
  66. }
  67. }
  68. if (!$isExecute) $query = $query->where($tableName.$column,$params[$param]);
  69. }
  70. return $query;
  71. }
  72. }