【问题标题】:Laravel: Eloquent relationship from JSONLaravel:来自 JSON 的雄辩关系
【发布时间】:2020-04-13 09:31:16
【问题描述】:

仍在 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 应该使用 Eloquent 关系从images 表中调用文件名(我假设它将是一对多)。

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

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

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

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

【问题讨论】:

  • 获取 JSON 数据。使用 json_decode() 转换为数组。从中提取“image_id”并进行查询。
  • 我的建议是将此“部分”JSON 数据移动到另一个表中。结果将是组织更好的代码、更清晰的解决方案和更好的性能(更好)。
  • @DanielPetrovaliev 附加查询不是比 json_decode 慢吗?而且我有点坚持逻辑 - 对于一个部分,我有 3-9 列,每列可能有它自己的图像,另外 - 每个部分也可能有它的图像。
  • @ArtemUshakov 如果您对每个对象使用 json_decode ,您将不得不为每个部分运行查询以获取图像并且会有 n+1 问题,但如果您有一个额外的表,您可以获得所有一个查询中的数据。这是我的想法。

标签: php json laravel eloquent


【解决方案1】:

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 }}

【讨论】:

  • 我一直在努力研究如何访问 JSON 对象,但您的文档并没有说明 JSON 对象是类似以下数组的情况:“[{\”supplier\” :\"228\",\"name\":\"The Making of Harry Potter - Studio Tour London\",\"booking_id\":\"1\",\"koedia\":\"7890\" ,\"client\":\"2\",\"net\":\"92\",\"sales\":\"95\"}]"
  • 是的,我愿意。因为我使用了你的代码并使用了belongToJson。我看到您目前不支持此功能,这是对您的 github 存储库的增强。我尝试使用 'coloumnName->koedia' 和 'coloumnName->[]->koedia' 但它们都不起作用。看起来好像没有以正确的顺序构建 json 查询。
  • 我整天都在努力使用这么好的包。但我收到以下错误:需要 php ^7.2.5 || ^8.0 -> 您的 php 版本(7.2;通过 config.platform 覆盖,实际:7.2.5)不满足该要求。
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 2015-03-14
  • 2018-11-28
  • 2015-01-11
  • 2021-06-03
  • 2020-03-26
  • 1970-01-01
相关资源
最近更新 更多