orlyapps/nova-belongsto-depend

Laravel Nova 字段。

3.0.4 2022-06-21 16:03 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'),

    ];
}

方法 dependsOn 接收它依赖的字段的 name 属性。如果手动指定了,请使用字段的 attribute 值。

选项

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;
    })

示例

  • 仓库 hasMany 文章
  • 文章 belongsToMany 供应商
  • 供应商 belongsToMany 文章
  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')

以下是一个示例

  • 分类 hasMany 模型 && belongsToMany 品牌
  • 品牌 hasMany 模型 && belongsToMany 分类
  • 模型 belongsTo 分类 && belongsTo 品牌
  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)。有关更多信息,请参阅 许可证文件