Răsfoiți Sursa

Grid\Selector支持关联关系字段查询

jqh 5 ani în urmă
părinte
comite
1fba827e2f

+ 1 - 1
resources/views/grid/selector.blade.php

@@ -1,5 +1,5 @@
 <div class="grid-selector">
-    @foreach($self->all() as $column => $selector)
+    @foreach($self->all(true) as $column => $selector)
         <div class="wrap">
             <div class="select-label">{{ $selector['label'] }}</div>
             <div class="select-options">

+ 3 - 3
src/Grid/Concerns/HasQuickSearch.php

@@ -58,7 +58,7 @@ trait HasQuickSearch
     {
         if ($this->quickSearch) {
             $this->quickSearch->setQueryName(
-                $this->getName().$this->quickSearch->queryName()
+                $this->getName().$this->quickSearch->getQueryName()
             );
         }
     }
@@ -94,7 +94,7 @@ trait HasQuickSearch
             return;
         }
 
-        $query = request()->get($this->quickSearch->queryName());
+        $query = request()->get($this->quickSearch->getQueryName());
 
         if ($query === '' || $query === null) {
             return;
@@ -104,7 +104,7 @@ trait HasQuickSearch
         $this->model()
             ->disableBindTreeQuery()
             ->treeUrlWithoutQuery(
-                $this->quickSearch->queryName()
+                $this->quickSearch->getQueryName()
             );
 
         if ($this->search instanceof \Closure) {

+ 15 - 7
src/Grid/Concerns/HasSelector.php

@@ -4,6 +4,7 @@ namespace Dcat\Admin\Grid\Concerns;
 
 use Dcat\Admin\Grid;
 use Dcat\Admin\Grid\Tools\Selector;
+use Dcat\Admin\Support\Helper;
 
 /**
  * @mixin Grid
@@ -51,22 +52,29 @@ trait HasSelector
         $active = $this->_selector->parseSelected();
 
         $this->_selector->all()->each(function ($selector, $column) use ($active) {
-            if (! array_key_exists($column, $active)) {
+            $key = $this->_selector->formatKey($column);
+
+            if (! array_key_exists($key, $active)) {
                 return;
             }
 
-            $values = $active[$column];
+            $values = $active[$key];
             if ($selector['type'] == 'one') {
                 $values = current($values);
             }
 
-            if (is_null($selector['query'])) {
-                is_array($values)
-                    ? $this->model()->whereIn($column, $values)
-                    : $this->model()->where($column, $values);
-            } else {
+            if ($selector['query']) {
                 call_user_func($selector['query'], $this->model(), $values);
+
+                return;
             }
+
+            Helper::withQueryCondition(
+                $this->model(),
+                $column,
+                is_array($values) ? 'whereIn' : 'where',
+                [$values]
+            );
         });
 
         return $this;

+ 1 - 1
src/Grid/Tools/QuickSearch.php

@@ -55,7 +55,7 @@ class QuickSearch extends AbstractTool
     /**
      * @return string
      */
-    public function queryName()
+    public function getQueryName()
     {
         return $this->queryName;
     }

+ 19 - 4
src/Grid/Tools/Selector.php

@@ -104,7 +104,7 @@ class Selector
     /**
      * @return string
      */
-    public function queryName()
+    public function getQueryName()
     {
         return $this->grid->getName().$this->queryNameSuffix;
     }
@@ -112,10 +112,18 @@ class Selector
     /**
      * Get all selectors.
      *
+     * @param bool $formatKey
+     *
      * @return array|Collection
      */
-    public function all()
+    public function all(bool $formatKey = false)
     {
+        if ($formatKey) {
+            return $this->selectors->mapWithKeys(function ($v, $k) {
+                return [$this->formatKey($k) => $v];
+            });
+        }
+
         return $this->selectors;
     }
 
@@ -128,7 +136,7 @@ class Selector
             return $this->selected;
         }
 
-        $selected = $this->request->get($this->queryName(), []);
+        $selected = $this->request->get($this->getQueryName(), []);
         if (! is_array($selected)) {
             return [];
         }
@@ -144,6 +152,11 @@ class Selector
         return $this->selected = $selected;
     }
 
+    public function formatKey($column)
+    {
+        return str_replace('.', '_', $column);
+    }
+
     /**
      * @param string $column
      * @param mixed  $value
@@ -153,11 +166,13 @@ class Selector
      */
     public function url($column, $value = null, $add = false)
     {
+        $column = $this->formatKey($column);
+
         $query = $this->request->query();
 
         $selected = $this->parseSelected();
         $options = Arr::get($selected, $column, []);
-        $queryName = "{$this->queryName()}.{$column}";
+        $queryName = "{$this->getQueryName()}.{$column}";
 
         if (is_null($value)) {
             Arr::forget($query, $queryName);