Browse Source

quickSearch支持关联关系字段查询

jqh 4 years ago
parent
commit
c5ba71daec
3 changed files with 53 additions and 39 deletions
  1. 1 34
      src/Grid/Column/Filter.php
  2. 7 5
      src/Grid/Concerns/HasQuickSearch.php
  3. 45 0
      src/Support/Helper.php

+ 1 - 34
src/Grid/Column/Filter.php

@@ -5,10 +5,7 @@ namespace Dcat\Admin\Grid\Column;
 use Dcat\Admin\Grid\Column;
 use Dcat\Admin\Grid\Model;
 use Dcat\Admin\Support\Helper;
-use Dcat\Laravel\Database\WhereHasInServiceProvider;
 use Illuminate\Contracts\Support\Renderable;
-use Illuminate\Support\Arr;
-use Illuminate\Support\Str;
 
 abstract class Filter implements Renderable
 {
@@ -138,37 +135,7 @@ abstract class Filter implements Renderable
      */
     protected function withQuery($model, string $query, array $params)
     {
-        $column = $this->getOriginalColumnName();
-
-        if (! Str::contains($column, '.')) {
-            $model->$query($column, ...$params);
-
-            return;
-        }
-
-        $this->withRelationQuery($model, $query, $params);
-    }
-
-    /**
-     * @param mixed $model
-     * @param string $query
-     * @param mixed ...$params
-     *
-     * @return void
-     */
-    protected function withRelationQuery($model, string $query, array $params)
-    {
-        $column = $this->getOriginalColumnName();
-
-        $relation = substr($column, 0, strrpos($column, '.'));
-        array_unshift($params, Arr::last(explode('.', $column)));
-
-        // 增加对whereHasIn的支持
-        $method = class_exists(WhereHasInServiceProvider::class) ? 'whereHasIn' : 'whereHas';
-
-        $model->$method($relation, function ($relation) use ($params, $query) {
-            $relation->$query(...$params);
-        });
+        Helper::withQueryCondition($model, $this->getOriginalColumnName(), $query, $params);
     }
 
     /**

+ 7 - 5
src/Grid/Concerns/HasQuickSearch.php

@@ -5,6 +5,7 @@ namespace Dcat\Admin\Grid\Concerns;
 use Dcat\Admin\Grid\Column;
 use Dcat\Admin\Grid\Model;
 use Dcat\Admin\Grid\Tools;
+use Dcat\Admin\Support\Helper;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Str;
 
@@ -99,6 +100,7 @@ trait HasQuickSearch
             return;
         }
 
+        // 树表格子节点忽略查询条件
         $this->model()
             ->disableBindTreeQuery()
             ->treeUrlWithoutQuery(
@@ -233,7 +235,7 @@ trait HasQuickSearch
         $likeOperator = 'like';
         $method = $or ? 'orWhere' : 'where';
 
-        $query->{$method}($column, $likeOperator, $pattern);
+        Helper::withQueryCondition($query, $column, $method, [$likeOperator, $pattern]);
     }
 
     /**
@@ -249,7 +251,7 @@ trait HasQuickSearch
     {
         $method = ($or ? 'orWhere' : 'where').ucfirst($function);
 
-        $query->$method($column, $value);
+        Helper::withQueryCondition($query, $column, $method, [$value]);
     }
 
     /**
@@ -274,7 +276,7 @@ trait HasQuickSearch
         $where = $or ? 'orWhere' : 'where';
         $method = $where.($not ? 'NotIn' : 'In');
 
-        $query->$method($column, $values);
+        Helper::withQueryCondition($query, $column, $method, [$values]);
     }
 
     /**
@@ -290,7 +292,7 @@ trait HasQuickSearch
     {
         $method = $or ? 'orWhereBetween' : 'whereBetween';
 
-        $query->$method($column, [$start, $end]);
+        Helper::withQueryCondition($query, $column, $method, [[$start, $end]]);
     }
 
     /**
@@ -319,6 +321,6 @@ trait HasQuickSearch
             $value = substr($value, 1, -1);
         }
 
-        $query->{$method}($column, $operator, $value);
+        Helper::withQueryCondition($query, $column, $method, [$operator, $value]);
     }
 }

+ 45 - 0
src/Support/Helper.php

@@ -3,6 +3,7 @@
 namespace Dcat\Admin\Support;
 
 use Dcat\Admin\Grid;
+use Dcat\Laravel\Database\WhereHasInServiceProvider;
 use Illuminate\Contracts\Support\Arrayable;
 use Illuminate\Contracts\Support\Htmlable;
 use Illuminate\Contracts\Support\Jsonable;
@@ -753,4 +754,48 @@ class Helper
             }
         }
     }
+
+    /**
+     * 设置查询条件.
+     *
+     * @param mixed $model
+     * @param string $column
+     * @param string $query
+     * @param mixed array $params
+     *
+     * @return void
+     */
+    public static function withQueryCondition($model, ?string $column, string $query, array $params)
+    {
+        if (! Str::contains($column, '.')) {
+            $model->$query($column, ...$params);
+
+            return;
+        }
+
+        static::withRelationQuery($model, $column, $query, $params);
+    }
+
+    /**
+     * 设置关联关系查询条件.
+     *
+     * @param mixed $model
+     * @param string $column
+     * @param string $query
+     * @param mixed ...$params
+     *
+     * @return void
+     */
+    public static function withRelationQuery($model, ?string $column, string $query, array $params)
+    {
+        $relation = substr($column, 0, strrpos($column, '.'));
+        array_unshift($params, Arr::last(explode('.', $column)));
+
+        // 增加对whereHasIn的支持
+        $method = class_exists(WhereHasInServiceProvider::class) ? 'whereHasIn' : 'whereHas';
+
+        $model->$method($relation, function ($relation) use ($params, $query) {
+            $relation->$query(...$params);
+        });
+    }
 }