我为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中的输出:
这是怎么了?
1条答案
按热度按时间1aaf6o9v1#
看起来你需要使用帐户ID进行过滤,但Laravel Nova使用的是帐户名。一种解决方法是使用自定义组件进行过滤。这样,你就可以控制选择选项的值并单独显示文本。
首先,你需要创建一个新的Vue组件。这个组件将用于过滤器。在这个组件中,你可以单独指定选择选项的值和显示文本。
下面是如何创建此组件的示例:
字符串
接下来,您需要在Nova服务提供商中注册此组件:
型
最后,您可以在
AccountFilter
类中使用此组件:型
在这个修改版本中,
apply
方法通过帐户ID进行过滤,options
方法返回一个数组,其中键是ID,值是名称。components
方法指定custom-filter
组件应用于此过滤。这样,Nova接口中选择的值将匹配apply
方法中使用的值。