QueryService.php 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?php
  2. namespace App\Services\common;
  3. use Carbon\Carbon;
  4. use Illuminate\Http\Request;
  5. Class QueryService
  6. {
  7. /**
  8. * parameter - query(sql) - special column description
  9. *
  10. * @param Request $request
  11. * @param object $query
  12. * @param array $columnQueryRules
  13. * @param string $tableName
  14. * @return object
  15. */
  16. public function query(Request $request,$query,array $columnQueryRules,$tableName = null)
  17. {
  18. foreach ($request->input() as $param => $value){
  19. if ($param === 'paginate' || $param === 'page')continue;
  20. if (!$value || isset($columnQueryRules[$param]))continue;
  21. $query = $query->where($tableName.$param,$value);
  22. }
  23. //rules: alias timeLimit startDate endDate like
  24. foreach ($columnQueryRules as $param => $rules){
  25. if (!$request->input($param))continue;
  26. $isExecute = true;
  27. $column = $param;
  28. foreach ($rules as $rule => $value){
  29. if ($rule === 'alias'){
  30. $column = $value;
  31. $isExecute = false;
  32. }
  33. if ($rule === 'timeLimit'){
  34. $today=Carbon::now()->subDays($value);
  35. $queryTemp=clone $query;
  36. $queryTemp=$queryTemp->where($tableName.$column,'like','%'.$request->input($param).'%')
  37. ->where($tableName.'created_at','>',$today->format('Y-m-d'));
  38. if($queryTemp->count()==0 || $queryTemp->first()[$column]==$request->input($param)){
  39. $query=$query->where($tableName.$column,$request->input($param));
  40. }else{
  41. $query=$query->where($tableName.$column,'like','%'.$request->input($param).'%')
  42. ->where($tableName.'created_at','>',$today->format('Y-m-d'));
  43. }
  44. $isExecute = true;
  45. }
  46. if ($rule === 'startDate'){
  47. $startDate = $request->input($param).$value;
  48. $query = $query->where($tableName.$column,'>=',$startDate);
  49. $isExecute = true;
  50. }
  51. if ($rule === 'endDate'){
  52. $endDate = $request->input($param).$value;
  53. $query = $query->where($tableName.$column,'<=',$endDate);
  54. $isExecute = true;
  55. }
  56. if ($rule === 'like'){
  57. $query = $query->where($tableName.$column,'like','%'.$request->input($param).'%');
  58. $isExecute = true;
  59. }
  60. }
  61. if (!$isExecute) $query = $query->where($tableName.$column,$request->input($param));
  62. }
  63. return $query;
  64. }
  65. }