我为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();
    }
}

如果在options()中返回的数组I为dd(),则如下所示:

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

但是,如果我判断Nova中的元素,我会看到以下SELECT选项:

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

如果Idd()apply()中的$value,我会看到该值实际上是帐户名,而不是我期望从选项列表返回的数组中返回的ID.

我决定手动返回上面粘贴的内容作为输出……

The code: manually overriding the options code

The output in Chrome: screenshot of Chrome inspection on rendered options

这里出了什么问题?

推荐答案

看起来你需要使用帐户ID进行过滤,但Laravel Nova使用的是帐户名.一种解决方法是为过滤器使用自定义组件.这样,您就可以控制 Select 选项的值并单独显示文本.

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

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

<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服务Provider 中注册此组件:

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界面中 Select 的值将与apply方法中使用的值匹配.

Php相关问答推荐

谷歌云SQL / mysql谁是对的?

为WooCommerce中的特定用户角色指定促销价格

如何在数据库中添加注册表单中的动态新行?

Symfony装置加载:try 从命名空间加载类";ClassUtils";Doctrine\Common\Util";

使用php ZipArhive类将Zip压缩文件分成多个部分

PHP -流加密启用服务器切断字节

从字符串转换日期和/或时间时,Laravel转换失败

如何配置我的.env文件以在laravel的一个项目中连接两个不同的数据库?

用户注册表单中的 HTTP 错误 405

在 Woocommerce 邮箱订单中显示产品 GTIN

如何在 PHP laravel 中将图像的透明背景转换为白色?

为WooCommerce中的Guest用户保存唯一的客户代码到订单中

如何在构建 PHP 类别数组树的递归函数中将父面包屑传递给子项?

在 GA4 Data API V1 Beta 中使用 inListFilter 过滤器时出错

将样式文件或脚本引入WordPress模板

列表不在 GROUP BY 子句中并且包含 X2CRM 中的非聚合列

如何使 Wordpress Woocommerce 自定义输入字段成为必填字段

PHP Remedy API 调用以创建附件无效的条目(使用 Postman Works!)

使用 PHP ImageMagick 库将 pdf 文件的前 n 页转换为单个 png 图像文件

复杂的mysql查询问题