granello/nova-belongsto-depend

Laravel Nova 字段。

3.0.7 2021-11-10 16:01 UTC

This package is auto-updated.

Last update: 2024-09-10 22:06:23 UTC


README

我做了什么更改

Latest Version on Packagist Total Downloads

Sample

使用较旧的Laravel版本?

此版本与Laravel 5.8及更高版本兼容。

如果您使用较旧的Laravel版本,可以使用该包的旧版本。这些不再维护,但应该相当稳定。我们仍然接受小的错误修复。

安装

您可以通过composer将包安装到使用Nova的Laravel应用中

composer require orlyapps/nova-belongsto-depend

在您的Nova资源中使用此字段

use Orlyapps\NovaBelongsToDepend\NovaBelongsToDepend;

public function fields(Request $request)
{
    return [
        ID::make()->sortable(),
        Text::make('Name')->rules('required', 'max:255'),

        NovaBelongsToDepend::make('Company')
            ->placeholder('Optional Placeholder') // Add this just if you want to customize the placeholder
            ->options(\App\Company::all()),
        NovaBelongsToDepend::make('Department')
            ->placeholder('Optional Placeholder') // Add this just if you want to customize the placeholder
            ->optionsResolve(function ($company) {
                // Reduce the amount of unnecessary data sent
                return $company->departments()->get(['id','name']);
            })
            ->dependsOn('Company'),
        NovaBelongsToDepend::make('Location')
            ->placeholder('Optional Placeholder') // Add this just if you want to customize the placeholder
            ->optionsResolve(function ($company) {
                // Reduce the amount of unnecessary data sent
                return $company->locations()->get(['id','name']);
            })
            ->fallback(
                Text::make('Location Name')->rules('required', 'max:255'),
            )
            ->hideLinkToResourceFromDetail()
            ->hideLinkToResourceFromIndex()
            ->nullable()
            ->dependsOn('Company'),

    ];
}

选项

placeholder('可选占位符')

openDirection('top') 查看选项值从vue-multiselect

翻译

以下字符串是可翻译的(将其添加到位于resources/lan/vendor/nova/*.json的语言文件中)。

  • 'Oops! No elements found. Consider changing the search query.'
  • 'List is empty'
  • 'Select'
  • 'Press enter to select'
  • 'Selected'
  • 'Press enter to remove'

如果您使用nova-translatable并且希望返回翻译后的名称,请将其添加到可翻译模型中

    /**
     * @return mixed
     */
    public function getNameAttribute()
    {
        return $this->getTranslations('name')[app()->getLocale()];
    }

性能提示

在将此字段附加到资源时,您可以在该资源的$with属性中包含字段关系,以防止在加载该资源的索引页面时出现n+1问题。

class Company extends Resource
{
  public static $with = [];
}

class Department extends Resource
{
  public static $with = ['company'];
}

class Location extends Resource
{
  public static $with = ['department', 'company'];
}

您还可以选择缓存顶级模型以减少对数据库的查询次数,从而减少索引中每行的查询次数。

NovaBelongsToDepend::make('Company')
    ->options(Cache::remember(
        'companies', 
        60, 
        function () { 
            return Company::all(); 
        }
    )),
NovaBelongsToDepend::make('Department')
    ->dependsOn('Company')
    ->optionsResolve(function($company) { 
        return $company->departments;
    })

示例

  • 仓库具有多个文章
  • 文章与供应商多对多关联
  • 供应商与文章多对多关联
  1. 选择一个仓库以获取仓库中的所有文章
  2. 选择一个文章以获取拥有该文章的所有供应商
public function fields(Request $request)
{
    return [
        ID::make()->sortable(),
        Text::make('Name')->rules('required', 'max:255'),

        NovaBelongsToDepend::make('Warehouse')
        ->options(\App\Warehouse::all())
        ->rules('required'),
        NovaBelongsToDepend::make('Article')
            ->optionsResolve(function ($warehouse) {
                return $warehouse->articles;
            })
            ->dependsOn('Warehouse')
            ->rules('required'),
        NovaBelongsToDepend::make('Supplier')
            ->optionsResolve(function ($article) {
                return \App\Supplier::whereHas('articles', function ($q) use ($article) {
                    $q->where('article_id', $article->id);
                })->get();
            })
            ->dependsOn('Article')
            ->rules('required'),


    ];
}

依赖于多个字段

CleanShot.2021-05-25.at.13.25.38.mp4

从本包的版本3开始,您可以通过在dependsOn方法中传递逗号分隔的字段来依赖于多个字段。

->dependsOn('classification', 'brand')

以下是一个示例

  • 分类具有多个模型且与品牌多对多关联
  • 品牌具有多个模型且与分类多对多关联
  • 模型属于分类且属于品牌
  1. 选择一个分类以获取该分类的所有品牌
  2. 选择一个品牌以获取具有该分类品牌的所有模型
public function fields(Request $request)
{
    return [
        ID::make(__('ID'), 'id')->sortable(),
        NovaBelongsToDepend::make('Classification', 'classification')
            ->options(\App\Models\Classification::all()),
        NovaBelongsToDepend::make('Brand', 'brand')
            ->optionsResolve(function ($classification) {
                return $classification->brands()->get(['brands.id', 'brands.name']);
            })
            ->dependsOn('classification'),
        NovaBelongsToDepend::make('Model', 'model', VehicleModel::class)
            ->optionsResolve(function ($depends) {
                return \App\Models\VehicleModel::query()
                    ->where('classification_id', $depends->classification->id)
                    ->where('brand_id', $depends->brand->id)
                    ->get();
            })
            ->dependsOn('classification', 'brand'),
    ];
}

安全性

如果您发现任何安全问题,请通过info@orlyapps.de发送电子邮件,而不是使用问题跟踪器。

鸣谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件