米歇尔·凯彭 / michielkempen/nova-polymorphic-field
A Laravel Nova 字段容器,允许依赖于其他字段的值
1.0.10
2020-05-04 11:50 UTC
Requires
- php: >=7.1.0
README
描述
一个 Laravel Nova 字段,允许您创建一个 多态资源集合。
根据您选择的聚合类型
- 不同的字段将在您的资源表/详情页中填充。
- 记录将在相应的表中自动创建/更新。
演示
安装
此包可以通过 Composer 安装。
composer require michielkempen/nova-polymorphic-field
用法
- 将
morphs
字段添加到您的基模型迁移中。 - 将
MichielKempen\NovaPolymorphicField\HasPolymorphicFields
特性添加到您的 Nova 资源中。 - 将
MichielKempen\NovaPolymorphicField\PolymorphicField
添加到您的 Nova 资源fields
方法中。 - 通过在
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, ]);
您可以在 AppServiceProvider
的 boot
函数中注册 morphMap
。
许可证
MIT 许可证(MIT)。请参阅许可证文件以获取更多信息。