gpt4 book ai didi

Nova 中的 Laravel 多态关系

转载 作者:行者123 更新时间:2023-12-05 07:30:56 24 4
gpt4 key购买 nike

我当前的博客类应用程序有一个页面,它可以有许多不同结构的段落(文本、图像、文件下载、注册表,...)。当试图将其转化为具有关系的 Eloquent 模型时,我认为这是一种简单的方法:

表格页面:

  • 编号
  • 标题,...

表格段落:

  • 编号
  • 页面编号
  • paragraphable_id
  • paragraphable_type

paragraph_texts:

  • 编号
  • 正文

paragraph_images:

  • 编号
  • 图片路径

paragraph_downloads:

  • 编号
  • 文件路径

和模型:

<?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 中查看页面并通过可选类型创建一个新段落。我根据 Eloquent 关系(页面的 HasMany 字段、段落的 MorphTo 和文本类型的 TextArea)创建了资源类(用于页面、段落和每个段落类型)。当我查看页面的详细信息并想要添加新段落时,我可以看到添加段落的表单并可以在下拉列表中选择段落类型,但只能看到已经存在的条目,而不是新条目。我永远不想添加这样的现有段落类型。

所以问题:

  • 结构转换成eloquent是否正确,有什么改进吗?
  • laravel nova 如何“通过”段落模型为页面创建新的段落类型?我觉得必须添加一个自定义字段才能这样做,这可能会要求先创建类型......

最佳答案

关于您的第一个问题:您应该使用 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;

关于Nova 中的 Laravel 多态关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52042096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com