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

示例

  • Warehouse hasMany Articles
  • Articles belongsToMany Suppliers
  • Suppliers belongsToMany Articles
  1. 选择一个 Warehouse 来获取仓库中的所有文章
  2. 选择一个 Article 来获取拥有此文章的所有供应商
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')

以下是一个示例

  • Classification hasMany Models && belongsToMany Brands
  • Brand hasMany Models && belongsToMany Classification
  • Model belongsTo Classification && belongsTo Brand
  1. 选择一个 Classification 来获取该分类的所有 Brands
  2. 选择一个 Brand 来获取具有此 ClassificationBrand 的所有 Models
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)。有关更多信息,请参阅 许可证文件