LogFilters.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. namespace App\Filters;
  3. use App\User;
  4. use Carbon\Carbon;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Arr;
  7. class LogFilters
  8. {
  9. protected $request;
  10. protected $queryBuilder;
  11. protected $filters = ['username', 'type', 'description',
  12. 'created_at_start', 'created_at_end', 'is_exception'];
  13. protected $array_filter;
  14. public function __construct(Request $request)
  15. {
  16. $this->request = $request;
  17. $this->array_filter = array_filter($this->request->only($this->filters));
  18. }
  19. public function apply($builder)
  20. {
  21. $this->queryBuilder = $builder;
  22. foreach ($this->array_filter as $filter => $value) {
  23. if (method_exists($this, $filter)) {
  24. $this->$filter($value, $this->queryBuilder);
  25. }
  26. }
  27. return $this->afterApply($this->queryBuilder);
  28. }
  29. public function afterApply($builder)
  30. {
  31. $this->queryBuilder = $builder;
  32. foreach ($this->array_filter as $filter => $value) {
  33. $filter .= '_after';
  34. if (method_exists($this, $filter)) {
  35. $this->$filter($value, $this->queryBuilder);
  36. }
  37. }
  38. if (!Arr::hasAny($this->array_filter, ['created_at_start', 'created_at_end'])) {
  39. $start = Carbon::now()->toDateString();
  40. $end = Carbon::tomorrow()->toDateString();
  41. $this->queryBuilder = $this->queryBuilder->where('created_at', '>=', $start)->where('created_at', '<', $end);
  42. }
  43. return $this->queryBuilder;
  44. }
  45. private function created_at_start($created_at_start)
  46. {
  47. $this->queryBuilder->where('created_at', '>=', $created_at_start);
  48. }
  49. private function created_at_end($created_at_end)
  50. {
  51. $this->queryBuilder->where('created_at', '<=', $created_at_end);
  52. }
  53. /**
  54. * 如果中传入开始时间,默认结束时间为开始时间的下一天
  55. * @param $created_at_start
  56. */
  57. private function created_at_start_after($created_at_start)
  58. {
  59. if (!Arr::has($this->array_filter, 'created_at_end')) {
  60. $endDay = Carbon::parse($created_at_start)->addDay()->toDateString();
  61. $this->queryBuilder->where('created_at', '<', $endDay);
  62. }
  63. }
  64. /**
  65. * 如果中传入截止时间,默认开始时间为开始时间的前一天
  66. * @param $created_at_end
  67. */
  68. private function created_at_end_after($created_at_end)
  69. {
  70. if (!Arr::has($this->array_filter, 'created_at_start')) {
  71. $startDay = Carbon::parse($created_at_end)->subDay()->toDateString();
  72. $this->queryBuilder->where('created_at', '>=', $startDay);
  73. }
  74. }
  75. private function description($description)
  76. {
  77. $this->queryBuilder->where("description", 'like', $description . '%');
  78. }
  79. private function type($type)
  80. {
  81. $types = array_filter(preg_split('/[,, ]+/is', $type));
  82. $this->queryBuilder->whereIn("type", $types);
  83. }
  84. private function username($username)
  85. {
  86. $this->queryBuilder->whereIn("id_user", function ($query) use ($username) {
  87. return $query->from("users")->select("id")->where("name", 'like', $username . '%');
  88. });
  89. }
  90. private function is_exception()
  91. {
  92. $this->queryBuilder->where(function ($query) {
  93. $query->where("method", "like", "ERROR%")->orWhere("method", "like", "EXCEPTION%");
  94. });
  95. }
  96. }