我当前的博客之类的应用程序具有Page
许多Paragraphs
不同的结构(文本、图像、文件下载、注册表单……)。在尝试将其转换为具有关系的 Eloquent 模型时,我认为这是一种简单的方法:
表pages
:
- ID
- 标题, ...
表paragraphs
:
- ID
- page_id
- 段落id
- 段落类型
表paragraph_texts
:
- ID
- 文本
表paragraph_images
:
- ID
- 图像路径
表paragraph_downloads
:
- ID
- 文件路径
和模型:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Page extends Model
{
public function paragraphs() {
return $this->hasMany(Paragraph::class);
}
}
?>
段落模型:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Paragraph extends Model
{
public $table = 'paragraphs';
public $timestamps = [];
public function page() {
return $this->belongsTo(Page::class);
}
public function paragraphable() {
return $this->morphTo();
}
}
文本类型模型作为示例:
<?php
namespace App\Models\ParagraphTypes;
use Illuminate\Database\Eloquent\Model;
class Text extends Model
{
protected $table = 'paragraph_texts';
public function paragraph() {
return $this->morphOne(Paragraph::class, 'paragraphable');
}
}
我现在想在 nova 中查看页面并通过可选类型创建一个新段落。我根据雄辩的关系(页面的 HasMany 字段,段落的 MorphTo 和 Text 类型的 TextArea)创建了资源类(用于页面、段落和每个段落类型)。当我看到一个页面的详细信息并想添加一个新段落时,我可以看到添加段落的表单,并且可以在下拉列表中选择段落类型,但只能看到已经存在的条目,而不是新的条目。我永远不想添加这样的现有段落类型。
所以问题:
- 将结构转化为 eloquent 是否正确,是否有任何改进?
- laravel nova 如何“通过”段落模型为页面创建新的段落类型?我觉得必须添加一个自定义字段才能这样做,这可能要求首先创建类型......