Laravel Nova 实现级联筛选器:制造商与型号的动态联动过滤

云丽姑娘_9595

云丽姑娘_9595

2026-09-04

182人浏览

原创

laravel nova 实现级联筛选器:制造商与型号的动态联动过滤 - php中文网

本文介绍如何在 Laravel Nova 中实现两个 Select Filter 的级联联动,使“型号”筛选器能根据所选“制造商”动态更新可选项,解决多级依赖筛选场景下的用户体验与数据准确性问题。

本文介绍如何在 Laravel Nova 中实现两个 Select Filter 的级联联动,使“型号”筛选器能根据所选“制造商”动态更新可选项,解决多级依赖筛选场景下的用户体验与数据准确性问题。

在 Laravel Nova 中,默认的 Filter 类不支持跨过滤器状态通信,因此无法直接在 Model 过滤器的 options() 方法中读取 Manufacturer 过滤器当前选中的值——这也是原问题中 $request->input() 或尝试解码请求参数返回 null 的根本原因。官方 Nova 并未内置依赖式(Dependent)筛选逻辑,需借助社区扩展方案实现。

推荐使用开源库 awesome-nova/dependent-filter,它专为 Nova 设计,通过轻量级 Vue 组件 + 后端钩子,实现了过滤器间的响应式联动,无需修改 Nova 核心,兼容性好且易于集成。

✅ 安装与配置

首先通过 Composer 安装依赖:

Laravel
Laravel

避免常见的Laravel错误:N+1查询、批量赋值、缓存陷阱及队列序列化陷阱。

下载
composer require awesome-nova/dependent-filter

发布前端资源(如使用 Nova v4+ 且启用 --no-publish 模式,请确认已运行 php artisan nova:publish --force):

php artisan vendor:publish --provider="AwesomeNova\Providers\DependentFilterServiceProvider"

✅ 改造 Manufacturer 过滤器(父级)

继承 AwesomeNova\Filters\DependentFilter 替代原生 Filter,并定义唯一 attribute(作为依赖键名):

<?php namespace App\Nova\Filters;

use Illuminate\Http\Request;
use App\Models\Product;
use AwesomeNova\Filters\DependentFilter;

class Manufacturer extends DependentFilter
{
    public $name = &#39;制造商&#39;;
    public $attribute = &#39;manufacturer&#39;; // ← 关键:此 key 将被 Model 过滤器引用
    public $component = &#39;awesome-nova-dependent-filter&#39;;

    public function apply(Request $request, $query, $value)
    {
        return $query->whereHas('product', fn ($q) => $q->where('manufacturer', $value));
    }

    public function options(Request $request, array $filters = [])
    {
        return Product::select('manufacturer')
            ->distinct()
            ->orderBy('manufacturer')
            ->pluck('manufacturer')
            ->mapWithKeys(fn ($m) => [$m => $m])
            ->toArray();
    }
}

? 注意:options() 方法签名已增强为 options(Request $request, array $filters = []),虽本例未使用 $filters,但该参数是子过滤器获取父值的基础通道。

✅ 改造 Model 过滤器(子级,依赖 Manufacturer)

关键在于声明 public $dependentOf = ['manufacturer'],并利用 $filters['manufacturer'] 动态构建查询:

<?php namespace App\Nova\Filters;

use Illuminate\Http\Request;
use App\Models\Product;
use AwesomeNova\Filters\DependentFilter;

class Model extends DependentFilter
{
    public $name = &#39;型号&#39;;
    public $attribute = &#39;model&#39;;
    public $component = &#39;awesome-nova-dependent-filter&#39;;

    public $dependentOf = [&#39;manufacturer&#39;]; // ← 声明依赖关系
    public $hideWhenEmpty = true; // 当 manufacturer 未选时,自动隐藏本过滤器(可选)

    public function apply(Request $request, $query, $value)
    {
        return $query->whereHas('product', fn ($q) => $q->where('model', $value));
    }

    public function options(Request $request, array $filters = [])
    {
        // ✅ 此处 $filters['manufacturer'] 即前端选中的值(已由 JS 自动注入)
        $manufacturer = $filters['manufacturer'] ?? null;

        if (! $manufacturer) {
            return []; // 无制造商时返回空选项,配合 $hideWhenEmpty 更友好
        }

        return Product::select('model')
            ->where('manufacturer', $manufacturer)
            ->distinct()
            ->orderBy('model')
            ->pluck('model')
            ->mapWithKeys(fn ($m) => [$m => $m])
            ->toArray();
    }
}

✅ 在 Resource 中注册(注意使用 ::make()

// app/Nova/Review.php
public function filters(Request $request)
{
    return [
        Manufacturer::make(), // 必须调用 make() 以启用依赖注入
        Model::make(),
    ];
}

⚠️ 注意事项与最佳实践

  • 字段一致性:确保 dependentOf 数组中的键(如 'manufacturer')与父过滤器的 $attribute 完全一致(大小写、下划线等),否则依赖无法识别;
  • 数据库性能:若 Product 表数据量大,建议为 (manufacturer, model) 字段添加联合索引:  
    ALTER TABLE products ADD INDEX idx_manufacturer_model (manufacturer, model);
  • 空值处理:子过滤器 options() 中务必检查 $filters[$key] 是否存在,避免 SQL 错误;$hideWhenEmpty = true 可提升 UI 清洁度;
  • 多级依赖$dependentOf 支持数组,例如 ['category', 'brand']options() 中可同时使用 $filters['category']$filters['brand'] 构建复合查询;
  • 缓存优化(进阶):对高频访问的选项列表,可在 options() 中加入 Laravel 缓存层,例如 Cache::remember("models_{$manufacturer}", 3600, fn () => ...)

通过以上改造,用户在 Nova 后台选择“Apple”后,“型号”下拉框将实时仅显示 Apple 相关机型(如 iPhone 15、MacBook Pro 等),显著提升筛选效率与数据准确性,真正实现企业级管理后台所需的智能过滤体验。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

8904

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5421

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

1995

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3348

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4014

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3151

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4477

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3482

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11542

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 176人学习

Composer手册
Composer手册

共0课时 | 0人学习