php Laravel Nova不使用数组键作为过滤器中的选项值

r1wp621o  于 2024-01-05  发布在  PHP
关注(0)|答案(1)|浏览(134)

我为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>


如果我在apply()dd()$value,我会看到该值确实是帐户名,而不是我期望从选项列表返回的数组中返回的ID。
我决定手动返回我上面粘贴的输出...
代码:

Chrome中的输出:

这是怎么了?

1aaf6o9v

1aaf6o9v1#

看起来你需要使用帐户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接口中选择的值将匹配apply方法中使用的值。

相关问题