私の現在のブログのようなアプリには、さまざまな構造 (テキスト、画像、ファイルのダウンロード、登録フォームなど) をPage
持つことができる があります。Paragraphs
これをリレーション付きの Eloquent モデルに変換しようとすると、これが簡単な方法だと思います。
表pages
:
- ID
- 題名、 ...
表paragraphs
:
- ID
- page_id
- 段落可能な_id
- 段落可能な_タイプ
表paragraph_texts
:
- ID
- 文章
表paragraph_images
:
- ID
- image_path
表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();
}
}
サンプルとしての Text Type モデル:
<?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、テキスト タイプの TextArea) に従って、リソース クラス (ページ、段落、および各段落の種類) を作成しました。ページの詳細を表示して新しい段落を追加したい場合、段落を追加するフォームが表示され、ドロップダウンで段落の種類を選択できますが、既存のエントリしか表示されず、新しいエントリは表示されません。このような既存の段落タイプを追加したくはありません。
だから質問:
- 構造の雄弁への変換は正しいですか、何か改善点はありますか?
- laravel novaは、段落モデルを「介して」ページの新しい段落タイプの作成をどのように処理できますか? そうするためにカスタムフィールドを追加する必要があるような気がします。最初に作成するタイプを要求するかもしれません...