Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.35 KB | None | 0 0
  1. <?php
  2. namespace BillChaser\Support;
  3.  
  4. use Illuminate\Database\Eloquent\Builder;
  5.  
  6. trait RecursiveFilter
  7. {
  8.     /**
  9.      * Recursively filter a query (with wildcard match).
  10.      *
  11.      * @param Builder &$query
  12.      * @param array $filters
  13.      * @param bool $loose
  14.      * @return void
  15.      */
  16.     public function applyRecursiveFilters(Builder &$query, array $filters, bool $loose = false, array &$ignore = []): void
  17.     {
  18.         foreach ($filters as $attribute => $filter) {
  19.             if (is_array($filter)) {
  20.                 if (array_filter($filter)) {
  21.                     $query->whereHas($attribute, function ($query) use ($filter, $loose, $ignore) {
  22.                         $this->applyRecursiveFilters($query, $filter, $loose, $ignore);
  23.                     });
  24.                 }
  25.             } elseif ($filter !== null) {
  26.                 if (array_search($attribute, $ignore) !== false) {
  27.                     continue;
  28.                 } elseif ($loose) {
  29.                     $query->where($attribute, 'like', "%${filter}%");
  30.                 } else {
  31.                     $query->where($attribute, $filter);
  32.                 }
  33.             }
  34.         }
  35.     }
  36.  
  37.     /**
  38.      * Recursively discover duplicate filters.
  39.      *
  40.      * @param Builder &$query
  41.      * @param array $filters
  42.      * @return void
  43.      */
  44.     public function getDuplicateFilters(array $filters, array &$duplicateFilters, array &$allFilters = []): void
  45.     {
  46.         foreach ($filters as $attribute => $filter) {
  47.             if (is_array($filter)) {
  48.                 if (array_filter($filter)) {
  49.                     $this->getDuplicateFilters($filter, $duplicateFilters, $allFilters);
  50.                 }
  51.             } elseif ($filter !== null) {
  52.                 if (array_search($attribute, $allFilters) !== false) {
  53.                     array_push($duplicateFilters, $attribute);
  54.                 } else {
  55.                     array_push($allFilters, $attribute);
  56.                 }
  57.             }
  58.         }
  59.     }
  60.  
  61.     public function applyDuplicateFilters(Builder &$query, array $filters, array $attributes): void
  62.     {
  63.         foreach ($attributes as $attribute) {
  64.             $found = false;
  65.             $this->conditionallySetDuplicateFilters($query, $filters, $attribute, $found);
  66.         }
  67.     }
  68.  
  69.     public function conditionallySetDuplicateFilters(Builder &$query, array $filters, string $attributeToApply, bool &$found): void
  70.     {
  71.         foreach ($filters as $attribute => $filter) {
  72.             if (is_array($filter)) {
  73.                 if (array_filter($filter)) {
  74.                     $query->whereHas($attribute, function ($query) use ($filter, $attributeToApply, $found) {
  75.                         $this->conditionallySetDuplicateFilters($query, $filter, $attributeToApply, $found);
  76.                     });
  77.                 }
  78.             } elseif ($attribute == $attributeToApply) {
  79.                 if ($found !== false) {
  80.                     \Log::info('In found attribute');
  81.                     $query->orWhere($attribute, 'like', "%${filter}%");
  82.                 } else {
  83.                     \Log::info($found);
  84.                     $found = true;
  85.                     \Log::info($found);
  86.                     \Log::info('In not found attribute');
  87.                     $query->where($attribute, 'like', "%${filter}%");
  88.                 }
  89.             }
  90.         }
  91.     }
  92.  
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement