From ee3da2b99fe828cc994ed576e1e018a046c7e611 Mon Sep 17 00:00:00 2001 From: Mior Muhammad Zaki Date: Mon, 30 Oct 2017 17:18:34 +0800 Subject: [PATCH] Allow to use Illuminate\Database\Query\Expression. Signed-off-by: Mior Muhammad Zaki --- src/Support/Traits/QueryFilter.php | 49 +++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/src/Support/Traits/QueryFilter.php b/src/Support/Traits/QueryFilter.php index 267f7bc..ca53387 100644 --- a/src/Support/Traits/QueryFilter.php +++ b/src/Support/Traits/QueryFilter.php @@ -4,6 +4,7 @@ use Orchestra\Support\Str; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Query\Expression; trait QueryFilter { @@ -113,34 +114,54 @@ protected function getBasicQueryOrderBy(array $input) * @param array $keyword * @param string $group * - * @return void + * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Query\Builder */ protected function buildWildcardQueryFilters($query, array $fields, array $keyword = []) { foreach ($fields as $field) { - if (Str::contains($field, '.') && $query instanceof Builder) { - list($relation, $field) = explode('.', $field, 2); - - $query->orWhereHas($relation, function ($query) use ($field, $keyword) { - $this->buildWildcardQueryFilterWithKeyword($query, $field, $keyword, 'where'); - }); - } else { - $this->buildWildcardQueryFilterWithKeyword($query, $field, $keyword, 'orWhere'); - } + $this->buildWildcardForField($query, $field, $keyword); + } + + return $query; + } + + /** + * + * Build wildcard query filter for field using where or orWhere. + * + * @param \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Query\Builder $query + * @param string $field + * @param array $keyword + * + * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Query\Builder + */ + protected function buildWildcardForField($query, $field, array $keyword) + { + if ($field instanceof Expression) { + return $this->buildWildcardForFieldUsing($query, $field->getValue(), $keyword, 'orWhere'); + } elseif (! (Str::contains($field, '.') && $query instanceof Builder)) { + return $this->buildWildcardForFieldUsing($query, $field, $keyword, 'orWhere'); } + + $this->buildWildcardForFieldUsing($query, $field, $keyword, 'orWhere'); + list($relation, $field) = explode('.', $field, 2); + + return $query->orWhereHas($relation, function ($query) use ($field, $keyword) { + $this->buildWildcardForFieldUsing($query, $field, $keyword, 'where'); + }); } /** - * Build wildcard query filter by keyword. + * Build wildcard query filter for field using where or orWhere. * * @param \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Query\Builder $query * @param string $field * @param array $keyword * @param string $group * - * @return void + * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Query\Builder */ - protected function buildWildcardQueryFilterWithKeyword($query, $field, array $keyword = [], $group = 'where') + protected function buildWildcardForFieldUsing($query, $field, array $keyword = [], $group = 'where') { $callback = function ($query) use ($field, $keyword) { foreach ($keyword as $key) { @@ -148,6 +169,6 @@ protected function buildWildcardQueryFilterWithKeyword($query, $field, array $ke } }; - $query->{$group}($callback); + return $query->{$group}($callback); } }