看起来你需要使用帐户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界面中选择的值将与
申请
方法