代码之家  ›  专栏  ›  技术社区  ›  eComEvo

Laravel Nova没有在过滤器中使用数组键作为选项值

  •  0
  • eComEvo  · 技术社区  · 2 年前

    我为Nova v4.32.11创建了这个过滤器:

    class AccountFilter extends Filter
    {
        public function apply(Request $request, $query, $value)
        {
            return $query->where('account_id', $value);
        }
    
        public function options(Request $request)
        {
            return Account::all()
                ->sortBy('name')
                ->mapWithKeys(function ($account) {
                    return [$account->id => $account->name];
                })
                ->toArray();
        }
    }
    

    如果我 dd() 中返回的数组 options() 它看起来是这样的:

    [
        1 => 'Foo',
        2 => 'Bar',
        3 => 'Baz',
    ]
    

    但是,如果我检查Nova中的元素,我会在选择选项中看到这一点:

    <select dusk="Account Filter-select-filter" class="w-full block form-control form-select form-control-sm form-select-bordered">
    <option value="">—</option>
    <option value="Foo">Foo</option>
    <option value="Bar">Bar</option>
    <option value="Baz">Baz</option>
    </select>
    

    如果我 dd() 这个 $value 在里面 apply() 我看到这个值实际上是帐户名,而不是ID,正如我从为选项列表返回的数组中所期望的那样。

    这里出了什么问题?

    1 回复  |  直到 2 年前
        1
  •  0
  •   Karl Hill    2 年前

    看起来你需要使用帐户ID进行过滤,但Laravel Nova使用的是帐户名。一种解决方法是为筛选器使用自定义组件。通过这种方式,您可以分别控制选择选项的值和显示文本。

    首先,您需要创建一个新的Vue组件。此组件将用于过滤器。在此组件中,可以分别指定选择选项的值和显示文本。

    以下是如何创建此组件的示例:

    <template>
        <select class="form-control form-select" v-model="value">
            <option v-for="(name, id) in options" :value="id">{{ name }}</option>
        </select>
    </template>
    
    <script>
    export default {
        props: ['options', 'value'],
    }
    </script>
    

    接下来,您需要在Nova服务提供商中注册此组件:

    public function boot()
    {
        parent::boot();
    
        Nova::script('custom-filter', __DIR__.'/../dist/js/filter.js');
        Nova::style('custom-filter', __DIR__.'/../dist/css/filter.css');
    
        Nova::provideToScript([
            'custom-filter' => new CustomFilter,
        ]);
    }
    

    最后,您可以在 AccountFilter 类别:

    class AccountFilter extends Filter
    {
        public function apply(Request $request, $query, $value)
        {
            return $query->where('account_id', $value);
        }
    
        public function options(Request $request)
        {
            return Account::all()
                ->sortBy('name')
                ->mapWithKeys(function ($account) {
                    return [$account->id => $account->name];
                })
                ->toArray();
        }
    
        public function components()
        {
            return [
                'custom-filter' => new CustomFilter,
            ];
        }
    }
    

    在此修改版本中 apply 方法根据帐户ID进行筛选,并且 options 方法返回一个数组,其中键是ID,值是名称。这个 components 方法指定 custom-filter 组件应用于此筛选器。这样,Nova界面中选择的值将与 申请 方法

    推荐文章