Nova

时间:2018-08-27 15:01:54

标签: laravel eloquent laravel-nova

我当前的博客之类的应用程序有一个Page,其中可能有许多Paragraphs具有不同的结构(文本,图像,文件下载,注册表单等)。尝试将其转换为具有关系的雄辩模型时,我认为这是一种简便的方法:

pages

  • id
  • 标题,...

paragraphs

  • id
  • page_id
  • paragraphable_id
  • paragraphable_type

paragraph_texts

  • id
  • 文本

paragraph_images

  • id
  • image_path

paragraph_downloads

  • id
  • file_path

和模型:

<?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和文本类型的TextArea)创建了Resource类(用于页面,用于段落和每种段落类型)。当我看到页面的详细信息并想要添加新段落时,可以看到添加段落的表单,并且可以在下拉列表中选择段落类型,但只能看到已经存在的条目,而不是新条目。我永远都不想添加这样的现有段落类型。

所以问题:

  • 将结构转换为雄辩的正确方法,是否有任何改进?
  • laravel nova如何处理“通过”段落模型为页面创建新的段落类型?我想必须添加一个自定义字段来执行此操作,这可能要求先创建类型...

1 个答案:

答案 0 :(得分:0)

关于第一个问题:您应该使用documentation中的关系:

class Page extends Model
{
    public function texts() {
        return $this->morphedByMany(Text::class, 'paragraphable', 'paragraphs');
    }
}

class Text extends Model
{
    public function pages() {
        return $this->morphToMany(Page::class, 'paragraphable', 'paragraphs');
    }
}

您可以通过访问器获得多种段落类型:

class Page extends Model
{
    public function getParagraphsAttribute() {
        return $this->texts->toBase()->merge($this->files)->merge([...]);
    }
}

$paragraphs = $page->paragraphs;