首页 > 解决方案 > Laravel:来自 JSON 的雄辩关系

问题描述

仍在 Laravel 中练习。此时,我有一个页面控制器,它可以找到相应页面可用的所有部分(简单的 HTML 部分)并将它们包含在刀片中,如下所示:

@foreach(@sections as @section)
  @include('sections.' . $section->filename)

然后我有一个sections包含相应部分数据的表,以及columns一个包含 JSON 数据的列,如下所示:

 {"header":"Section column 1", "text":"bruh?", "image_id":""},
 {"header":"Section column 2", "text":"bruh?", "image_id":""},
 {"header":"Section column 3", "text":"bruh?", "image_id":"7"}

如您所见,image_id应该images使用 Eloquent 关系从表中调用文件名(我假设它将是一对多)。

是的,我知道将 JSON 存储在表中并不是最好的解决方案(尤其是如果你想从它交叉请求数据),但这是我想出的最好的解决方案。

所以,问题是:如何仅使用来自 JSON 对象的 ID 获取图像的文件名,或者除了 JSON 之外是否有任何不同的解决方案

PScolumns表和 JSON 格式用于定义一些属性,因为我的某些部分有 3-9 个文本列 ( col-md-3),并且每个部分都有不同的标题、文本和图像,所以我将它们存储在 JSON 中。

PPS 我的 JSON 格式是有效的,我只是删除了一些格式以保持这个问题清晰。

标签: phpjsonlaraveleloquent

解决方案


Laravel 没有对 JSON 关系的原生支持。

我为此创建了一个包:https ://github.com/staudenmeir/eloquent-json-relations

class Section extends Model
{
    use \Staudenmeir\EloquentJsonRelations\HasJsonRelationships;

    protected $casts = [
       'columns' => 'json',
    ];

    public function image()
    {
        return $this->belongsTo(Image::class, 'columns->image_id');
    }
}

class Image extends Model
{
    use \Staudenmeir\EloquentJsonRelations\HasJsonRelationships;

    public function sections()
    {
       return $this->hasMany(Section::class, 'columns->image_id');
    }
}

{{ $section->image->filename }}

推荐阅读