米歇尔·凯彭/michielkempen/nova-polymorphic-field

A Laravel Nova 字段容器,允许依赖于其他字段的值

1.0.10 2020-05-04 11:50 UTC

This package is auto-updated.

Last update: 2024-09-04 21:54:06 UTC


README

Latest Version on Packagist Total Downloads License

描述

一个 Laravel Nova 字段,允许您创建一个 多态资源集合

根据您选择的聚合类型

  1. 不同的字段将在您的资源表/详情页中填充。
  2. 记录将在相应的表中自动创建/更新。

Scheme

演示

Scheme

安装

此包可以通过 Composer 安装。

composer require michielkempen/nova-polymorphic-field

用法

  1. morphs 字段添加到您的基模型迁移中。
  2. MichielKempen\NovaPolymorphicField\HasPolymorphicFields 特性添加到您的 Nova 资源中。
  3. MichielKempen\NovaPolymorphicField\PolymorphicField 添加到您的 Nova 资源 fields 方法中。
  4. 通过在 PolymorphicField 上调用 type($name, $modelClass) 方法来指定不同的聚合类型。
    • $name 参数是为您的聚合类型指定的可读名称。
    • $modelClass 参数是聚合模型类。

示例

迁移

Schema::create('news_posts', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->morphs('type'); // !!
    $table->timestamps();
});

Schema::create('videos', function (Blueprint $table) {
    $table->increments('id');
    $table->string('url');
});

Schema::create('articles', function (Blueprint $table) {
    $table->increments('id');
    $table->string('image');
    $table->text('text');
});

资源

class NewsPost extends Resource
{
    use HasPolymorphicFields;

    public function fields(Request $request)
    {
        return [
            
            Text::make('Title'),

            PolymorphicField::make('Type')
                ->type('Video', \App\Video::class, [

                    Text::make('Url'),

                ])
                ->type('Article', \App\Article::class, [

                    Image::make('Image'),

                    Textarea::make('Text'),

                ]),

        ];
    }
}

在更新资源时,您可以选择隐藏类型选择。如果您不想让用户在创建聚合关系后更改 类型,这可能很有用。

class NewsPost extends Resource
{
    use HasPolymorphicFields;

    public function fields(Request $request)
    {
        return [
            ...
            PolymorphicField::make('Type')
                ->type('Video', \App\Video::class, [
                    Text::make('Url'),
                ])
                ->type('Article', \App\Article::class, [
                    Image::make('Image'),
                    Textarea::make('Text'),
                ])
                ->hideTypeWhenUpdating(),
            ...
        ];

morphMap

默认情况下,相关模型的完全限定类名将存储在基模型中的类型字段中。但是,您可能希望将数据库与应用程序内部结构解耦。在这种情况下,您可以定义一个“聚合映射”关系,指示 Eloquent 使用每个模型的自定义名称而不是类名。

use Illuminate\Database\Eloquent\Relations\Relation;

Relation::morphMap([
    'article' => \App\Article::class,
    'video' => \App\Video::class,
]);

您可以在 AppServiceProviderboot 函数中注册 morphMap

许可证

MIT 许可证(MIT)。请参阅许可证文件以获取更多信息。