3

私の現在のブログのようなアプリには、さまざまな構造 (テキスト、画像、ファイルのダウンロード、登録フォームなど) を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は、段落モデルを「介して」ページの新しい段落タイプの作成をどのように処理できますか? そうするためにカスタムフィールドを追加する必要があるような気がします。最初に作成するタイプを要求するかもしれません...
4

1 に答える 1