QueryService.php 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. if ($tableName) $tableName .= ".";
  19. foreach ($request->input() as $param => $value){
  20. if ($param === 'paginate' || $param === 'page')continue;
  21. if (!$value || isset($columnQueryRules[$param]))continue;
  22. $query = $query->where($tableName.$param,$value);
  23. }
  24. //rules: alias timeLimit startDate endDate like multi
  25. foreach ($columnQueryRules as $param => $rules){
  26. if (!$request->input($param))continue;
  27. $isExecute = true;
  28. $column = $param;
  29. foreach ($rules as $rule => $value){
  30. if ($rule === 'alias'){
  31. $column = $value;
  32. $isExecute = false;
  33. }
  34. if ($rule === 'timeLimit'){
  35. $today=Carbon::now()->subDays($value);
  36. $queryTemp=clone $query;
  37. $queryTemp=$queryTemp->where($tableName.$column,'like','%'.$request->input($param).'%')
  38. ->where($tableName.'created_at','>',$today);
  39. if($queryTemp->count()==0 || $queryTemp->first()[$column]==$request->input($param)){
  40. $query=$query->where($tableName.$column,$request->input($param));
  41. }else{
  42. $query=$query->where($tableName.$column,'like','%'.$request->input($param).'%')
  43. ->where($tableName.'created_at','>',$today);
  44. }
  45. $isExecute = true;
  46. }
  47. if ($rule === 'startDate'){
  48. $startDate = $request->input($param).$value;
  49. $query = $query->where($tableName.$column,'>=',$startDate);
  50. $isExecute = true;
  51. }
  52. if ($rule === 'endDate'){
  53. $endDate = $request->input($param).$value;
  54. $query = $query->where($tableName.$column,'<=',$endDate);
  55. $isExecute = true;
  56. }
  57. if ($rule === 'like'){
  58. $query = $query->where($tableName.$column,'like',$value.$request->input($param).'%');
  59. $isExecute = true;
  60. }
  61. if ($rule === 'multi'){
  62. $query = $query->whereIn($tableName.$column,explode($value,$request->input($param)));
  63. $isExecute = true;
  64. }
  65. }
  66. if (!$isExecute) $query = $query->where($tableName.$column,$request->input($param));
  67. }
  68. return $query;
  69. }
  70. }