FacilitatorExternalFilters.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace App\Filters;
  3. use App\Facilitator;
  4. use App\Traits\ModelSearchWay;
  5. use Illuminate\Database\Eloquent\Builder;
  6. use Illuminate\Http\Request;
  7. class FacilitatorExternalFilters
  8. {
  9. use ModelSearchWay;
  10. protected $request;
  11. protected $queryBuilder;
  12. protected $filters = [
  13. 'created_at_start', 'created_at_end', 'facilitator_id', 'range_data', 'id'
  14. ];
  15. protected $array_filter;
  16. protected $params = [];
  17. public function __construct(Request $request)
  18. {
  19. $this->request = $request;
  20. $this->params = $request->all();
  21. $request['range_data'] = $request['data'];
  22. unset($request['data']);
  23. $this->array_filter = array_filter($this->request->only($this->filters));
  24. }
  25. public function apply($builder)
  26. {
  27. $this->queryBuilder = $builder;
  28. foreach ($this->array_filter as $filter => $value) {
  29. if (method_exists($this, $filter)) {
  30. $this->$filter($value, $this->queryBuilder);
  31. }
  32. }
  33. return $this->queryBuilder;
  34. }
  35. public function created_at_start($created_at_start)
  36. {
  37. $this->queryBuilder->where('discharge_tasks.created_at', '>=', $created_at_start);
  38. }
  39. public function created_at_end($created_at_end)
  40. {
  41. $this->queryBuilder->where('discharge_tasks.created_at', '<=', $created_at_end);
  42. }
  43. // 卸货队 和 时间区间
  44. public function range_data($range_data)
  45. {
  46. $rangeData = explode(',', $range_data);
  47. $params = [];
  48. foreach ($rangeData as $rangeDatum) {
  49. $data = explode(';', $rangeDatum);
  50. $data = $this->getSearchArr($data);
  51. if (empty($params[$data['id']])) {
  52. $params[$data['id']] = [];
  53. }
  54. $params[$data['id']][] = $data['months'];
  55. }
  56. $arr = [];
  57. foreach ($params as $key => $param) {
  58. $facilitator_id = $key;
  59. $rangeData = '';
  60. foreach ($param as $item) {
  61. $rangeData .= $item . '|';
  62. }
  63. $rangeData = rtrim($rangeData, '|');
  64. $arr[$facilitator_id] = $rangeData;
  65. }
  66. $this->queryBuilder->where(function ($query) use ($arr) {
  67. foreach ($arr as $key => $item) {
  68. $query->orWhere(function ($query) use ($key, $item) {
  69. /** @var Builder $query */
  70. $query->where('discharge_tasks.facilitator_id', $key)->where('discharge_tasks.created_at', 'regexp', '(' . $item . ')');
  71. });
  72. }
  73. });
  74. }
  75. private function getSearchArr($data): array
  76. {
  77. $param = [];
  78. foreach ($data as $datum) {
  79. $arr = explode(':', $datum);
  80. $param[$arr[0]] = $arr[1];
  81. }
  82. return $param;
  83. }
  84. public function facilitator_id($facilitator_id)
  85. {
  86. $this->searchWay($this->queryBuilder, $facilitator_id, 'discharge_tasks.facilitator_id');
  87. }
  88. public function id($id)
  89. {
  90. $facilitator = Facilitator::query()->fromQuery('select id from facilitators where MD5(id) = ?',[$id]);
  91. $this->queryBuilder->whereIn('discharge_tasks.facilitator_id',$facilitator);
  92. }
  93. }