QueryService.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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 $queryParam ($request->all())
  11. * @param object $query
  12. * @param array $columnQueryRules
  13. * @param string $tableName
  14. * @return object
  15. */
  16. public function queryCondition($queryParam,$query,array $columnQueryRules,$tableName = null)
  17. {
  18. if ($tableName) $tableName .= ".";
  19. foreach ($queryParam 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. $queryCondition=$queryParam[$param]??null;
  27. if (!$queryCondition)continue;
  28. $isExecute = true;
  29. $column = $param;
  30. foreach ($rules as $rule => $value){
  31. if ($rule === 'alias'){
  32. $column = $value;
  33. $isExecute = false;
  34. }
  35. if ($rule === 'timeLimit'){
  36. $today=Carbon::now()->subDays($value);
  37. $queryTemp=clone $query;
  38. $queryTemp=$queryTemp->where($tableName.$column,'like','%'.$queryCondition.'%')
  39. ->where($tableName.'created_at','>',$today);
  40. if($queryTemp->count()==0 || $queryTemp->first()[$column]==$queryCondition){
  41. $query=$query->where($tableName.$column,$queryCondition);
  42. }else{
  43. $query=$query->where($tableName.$column,'like','%'.$queryCondition.'%')
  44. ->where($tableName.'created_at','>',$today);
  45. }
  46. $isExecute = true;
  47. }
  48. if ($rule === 'startDate'){
  49. $startDate = $queryCondition.$value;
  50. $query = $query->where($tableName.$column,'>=',$startDate);
  51. $isExecute = true;
  52. }
  53. if ($rule === 'endDate'){
  54. $endDate = $queryCondition.$value;
  55. $query = $query->where($tableName.$column,'<=',$endDate);
  56. $isExecute = true;
  57. }
  58. if ($rule === 'like'){
  59. $query = $query->where($tableName.$column,'like',$value.$queryCondition.$value);
  60. $isExecute = true;
  61. }
  62. if ($rule === 'multi'){
  63. $query = $query->whereIn($tableName.$column,explode($value,$queryCondition));
  64. $isExecute = true;
  65. }
  66. }
  67. if (!$isExecute) $query = $query->where($tableName.$column,$queryCondition);
  68. }
  69. return $query;
  70. }
  71. /**
  72. * parameter - query(sql) - special column description
  73. *
  74. * @param Request $request
  75. * @param object $query
  76. * @param array $columnQueryRules
  77. * @param string $tableName
  78. * @return object
  79. */
  80. public function query(Request $request,$query,array $columnQueryRules,$tableName = null)
  81. {
  82. if ($tableName) $tableName .= ".";
  83. foreach ($request->input() as $param => $value){
  84. if ($param === 'paginate' || $param === 'page')continue;
  85. if (!$value || isset($columnQueryRules[$param]))continue;
  86. $query = $query->where($tableName.$param,$value);
  87. }
  88. //rules: alias timeLimit startDate endDate like multi
  89. foreach ($columnQueryRules as $param => $rules){
  90. if (!$request->input($param))continue;
  91. $isExecute = true;
  92. $column = $param;
  93. foreach ($rules as $rule => $value){
  94. if ($rule === 'alias'){
  95. $column = $value;
  96. $isExecute = false;
  97. }
  98. if ($rule === 'timeLimit'){
  99. $today=Carbon::now()->subDays($value);
  100. $queryTemp=clone $query;
  101. $queryTemp=$queryTemp->where($tableName.$column,'like','%'.$request->input($param).'%')
  102. ->where($tableName.'created_at','>',$today);
  103. if($queryTemp->count()==0 || $queryTemp->first()[$column]==$request->input($param)){
  104. $query=$query->where($tableName.$column,$request->input($param));
  105. }else{
  106. $query=$query->where($tableName.$column,'like','%'.$request->input($param).'%')
  107. ->where($tableName.'created_at','>',$today);
  108. }
  109. $isExecute = true;
  110. }
  111. if ($rule === 'startDate'){
  112. $startDate = $request->input($param).$value;
  113. $query = $query->where($tableName.$column,'>=',$startDate);
  114. $isExecute = true;
  115. }
  116. if ($rule === 'endDate'){
  117. $endDate = $request->input($param).$value;
  118. $query = $query->where($tableName.$column,'<=',$endDate);
  119. $isExecute = true;
  120. }
  121. if ($rule === 'like'){
  122. $query = $query->where($tableName.$column,'like',$value.$request->input($param).$value);
  123. $isExecute = true;
  124. }
  125. if ($rule === 'multi'){
  126. $query = $query->whereIn($tableName.$column,explode($value,$request->input($param)));
  127. $isExecute = true;
  128. }
  129. }
  130. if (!$isExecute) $query = $query->where($tableName.$column,$request->input($param));
  131. }
  132. return $query;
  133. }
  134. }