Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- namespace BillChaser\Support;
- use Illuminate\Database\Eloquent\Builder;
- trait RecursiveFilter
- {
- /**
- * Recursively filter a query (with wildcard match).
- *
- * @param Builder &$query
- * @param array $filters
- * @param bool $loose
- * @return void
- */
- public function applyRecursiveFilters(Builder &$query, array $filters, bool $loose = false, array &$ignore = []): void
- {
- foreach ($filters as $attribute => $filter) {
- if (is_array($filter)) {
- if (array_filter($filter)) {
- $query->whereHas($attribute, function ($query) use ($filter, $loose, $ignore) {
- $this->applyRecursiveFilters($query, $filter, $loose, $ignore);
- });
- }
- } elseif ($filter !== null) {
- if (array_search($attribute, $ignore) !== false) {
- continue;
- } elseif ($loose) {
- $query->where($attribute, 'like', "%${filter}%");
- } else {
- $query->where($attribute, $filter);
- }
- }
- }
- }
- /**
- * Recursively discover duplicate filters.
- *
- * @param Builder &$query
- * @param array $filters
- * @return void
- */
- public function getDuplicateFilters(array $filters, array &$duplicateFilters, array &$allFilters = []): void
- {
- foreach ($filters as $attribute => $filter) {
- if (is_array($filter)) {
- if (array_filter($filter)) {
- $this->getDuplicateFilters($filter, $duplicateFilters, $allFilters);
- }
- } elseif ($filter !== null) {
- if (array_search($attribute, $allFilters) !== false) {
- array_push($duplicateFilters, $attribute);
- } else {
- array_push($allFilters, $attribute);
- }
- }
- }
- }
- public function applyDuplicateFilters(Builder &$query, array $filters, array $attributes): void
- {
- foreach ($attributes as $attribute) {
- $found = false;
- $this->conditionallySetDuplicateFilters($query, $filters, $attribute, $found);
- }
- }
- public function conditionallySetDuplicateFilters(Builder &$query, array $filters, string $attributeToApply, bool &$found): void
- {
- foreach ($filters as $attribute => $filter) {
- if (is_array($filter)) {
- if (array_filter($filter)) {
- $query->whereHas($attribute, function ($query) use ($filter, $attributeToApply, $found) {
- $this->conditionallySetDuplicateFilters($query, $filter, $attributeToApply, $found);
- });
- }
- } elseif ($attribute == $attributeToApply) {
- if ($found !== false) {
- \Log::info('In found attribute');
- $query->orWhere($attribute, 'like', "%${filter}%");
- } else {
- \Log::info($found);
- $found = true;
- \Log::info($found);
- \Log::info('In not found attribute');
- $query->where($attribute, 'like', "%${filter}%");
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement