MaterialFilters.php 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. <?php
  2. namespace App\Filters;
  3. use Illuminate\Http\Request;
  4. class MaterialFilters
  5. {
  6. protected $request;
  7. protected $queryBuilder;
  8. protected $filters = [];
  9. protected $array_filter;
  10. protected $params = ['code','name'];
  11. public function __construct(Request $request)
  12. {
  13. $this->request = $request;
  14. $this->params = $request->all();
  15. $this->array_filter = array_filter($this->request->only($this->filters));
  16. }
  17. private function isSearchLike($str)
  18. {
  19. if (substr($str, 0, 1) == "%" || substr($str, strlen($str) - 1, 1) == "%") {
  20. return true;
  21. }
  22. return false;
  23. }
  24. private function searchWay($query, $param, $column)
  25. {
  26. if ($this->isSearchLike($param)) {
  27. $query->where($column, 'like', $param);
  28. } else {
  29. $query->whereIn($column, array_filter(preg_split('/[,, ]+/is', $param)));
  30. }
  31. return $query;
  32. }
  33. public function apply($builder)
  34. {
  35. $this->queryBuilder = $builder;
  36. foreach ($this->array_filter as $filter => $value) {
  37. if (method_exists($this, $filter)) {
  38. $this->$filter($value, $this->queryBuilder);
  39. }
  40. }
  41. return $this->queryBuilder;
  42. }
  43. public function code($code)
  44. {
  45. $this->searchWay($this->queryBuilder,$code,'code');
  46. }
  47. public function name($name)
  48. {
  49. $this->searchWay($this->queryBuilder,$name,'name');
  50. }
  51. }