Laravel Nova 将一个过滤器的值传递给另一个过滤器

问题描述 投票:0回答:2

我正在尝试使用 2 个“选择过滤器”来过滤 Laravel Nova 资源(评论)数据。

我有一个过滤器 A = 制造商,过滤器 B = 型号。

一个制造商有很多型号。我的产品表中有制造商和型号列。

“模型”过滤器默认显示选择下拉列表中的所有值。当选择“制造商”时,我想减少“模型”过滤器中的选择选项。

因此,例如:当制造商 =“Apple”时,“型号”过滤器应仅显示 Apple“型号”。

在我的评论资源中,我有以下代码:

/**
 * Get the filters available for the resource.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
public function filters(Request $request)
{
    return [
        new Manufacturer(),
        new Model(),
    ];
}

制造商过滤器代码

class Manufacturer extends Filter
{
    
    /**
     * The filter's component.
     *
     * @var string
     */
    public $component = 'select-filter';

/**
 * Apply the filter to the given query.
 *
 * @param \Illuminate\Http\Request              $request
 * @param \Illuminate\Database\Eloquent\Builder $query
 * @param mixed                                 $value
 *
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function apply(Request $request, $query, $value)
{
    return $query->whereHas('product', function ($query) use ($value) {
        $query->where('manufacturer', $value);
    });
}

/**
 * Get the filter's available options.
 *
 * @param \Illuminate\Http\Request $request
 *
 * @return array
 */
public function options(Request $request)
{
    return Product::select('manufacturer')
        ->withoutGlobalScopes()
        ->withoutTrashed()
        ->groupBy('manufacturer')
        ->orderBy('manufacturer')
        ->pluck('manufacturer')
        ->mapWithKeys(function ($manufacturer) {
            return [$manufacturer => strtolower($manufacturer)];
        })
        ->toArray();
}

}

型号 过滤器代码

class Model extends Filter
{
    
    /**
     * The filter's component.
     *
     * @var string
     */
    public $component = 'select-filter';

/**
 * Apply the filter to the given query.
 *
 * @param \Illuminate\Http\Request              $request
 * @param \Illuminate\Database\Eloquent\Builder $query
 * @param mixed                                 $value
 *
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function apply(Request $request, $query, $value)
{
    return $query->whereHas('product', function ($query) use ($value) {
        $query->where('model', $value);
    });
}

/**
 * Get the filter's available options.
 *
 * @param \Illuminate\Http\Request $request
 *
 * @return array
 */
public function options(Request $request)
{
    //
    //
    //I want to add a condition below ->where('manufacturer', $manufacturer)
    //
    //

    return Product::select('model')
        ->withoutGlobalScopes()
        ->withoutTrashed()
        ->groupBy('model')
        ->orderBy('model')
        ->pluck('model')
        ->mapWithKeys(function ($model) {
            return [$model => strtolower($model)];
        })
        ->toArray();
}

}

我尝试解码 $request 以获取过滤器值,但返回 null。

php laravel laravel-8 laravel-nova
2个回答
0
投票

我找到了可以帮助实现我想要的目标的库。

可以在这里找到该库:https://github.com/awesome-nova/dependent-filter

安装上述库后,可以如下设置两个过滤器:

过滤器A

<?php

namespace App\Nova\Filters;

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

class Manufacturer extends DependentFilter
{
/**
 * Name of filter.
 *
 * @var string
 */
public $name = 'Manufacturer';

/**
 * Attribute name of filter. Also it is key of filter.
 *
 * @var string
 */
public $attribute = 'manufacturer';

/**
 * The filter's component.
 *
 * @var string
 */
public $component = 'awesome-nova-dependent-filter';

/**
 * Apply the filter to the given query.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Illuminate\Database\Eloquent\Builder  $query
 * @param  mixed  $value
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function apply(Request $request, $query, $value)
{
    return $query->whereHas('product', function ($query) use ($value) {
        $query->where('manufacturer', $value);
    });
}

/**
 * Get the filter's available options.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
public function options(Request $request, array $filters = [])
{
    return Product::select('manufacturer')
        ->pluck('manufacturer')
        ->mapWithKeys(function ($manufacturer) {
            return [$manufacturer => $manufacturer];
        })->toArray();
}

过滤器B

<?php

namespace App\Nova\Filters;

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

class Model extends DependentFilter
{
    /**
     * Name of filter.
     *
     * @var string
     */
    public $name = 'Model';
    
    /**
     * Attribute name of filter. Also it is key of filter.
     *
     * @var string
     */
    public $attribute = 'model';
    
    /**
     * The filter's component.
     *
     * @var string
     */
    public $component = 'awesome-nova-dependent-filter';

    /**
     * The filter's dependentOf.
     *
     * @var array
     */
    public $dependentOf = ['manufacturer'];

    public $hideWhenEmpty = true;

    /**
     * Apply the filter to the given query.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @param  mixed  $value
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function apply(Request $request, $query, $value)
    {
        return $query->whereHas('product', function ($query) use ($value) {
            $query->where('model', $value);
        });
    }

    /**
     * Get the filter's available options.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function options(Request $request, array $filters = [])
    {
        return Product::select('model')
            ->where('manufacturer', $filters['manufacturer'])
            ->pluck('model')
            ->mapWithKeys(function ($model) {
                return [$model => $model];
            })->toArray();
    }
}

资源文件

public function filters(Request $request)
{
    return [
        Manufacturer::make(),
        Model::make(),
    ];
}

-1
投票

尝试遵循您的代码以使其正常工作,但在“模型”下拉列表中我什么也没有。

© www.soinside.com 2019 - 2024. All rights reserved.