转换为json时如何修改关系?

时间:2017-09-22 18:23:38

标签: php laravel eloquent laravel-5.5

我的父母有很多孩子:

class Parent extends Model
{
    public function children()
    {
        return $this->hasMany(Child::class);
    }
}


class Child extends Model
{
    public function parent()
    {
        return $this->belongsTo(Parent::class);
    }
}

子模型只有2个属性:parent_idvalue。我想在将父级转换为json时“拔出”值,而不是

{
  "name": "name1",
  "children": [
    {
      "value": "value1"
    },
    {
      "value": "value2"
    }
  ]
}

我得到了

{
  "name": "name1",
  "children": [
    "value1",
    "value2"
  ]
}

我知道可以通过声明新的getValuesAttribute并将protected $appends = ['values'];添加到Parent模型来完成,但我想这样做而不重命名属性(我希望值在{{1}数组而不是children数组)。如果我使用与关系相同的名称定义mutator属性,则显然会导致错误。

我该怎么做?

3 个答案:

答案 0 :(得分:0)

一种方法是使用Fractal将数据表示与模型分开。如果定义分形变换器以匹配所需的结构,则可以将数据传递到控制器中的变换器,并在不触及模型的情况下更改JSON的结构。

编辑:Laravel 5.5引入了resources,这是Fractal的一个更简单的替代方案,但基本上做同样的事情。

答案 1 :(得分:0)

如果你会这样做会怎么样:

$ scrapy shell --nolog

>>> from scrapy import Request
>>> req = Request("https://www.magzter.com/magazines/listAllIssues/146/12", headers = {"X-Requested-With" : "XMLHttpRequest"})
>>> fetch(req)
>>> response.body
b'\r\n\t<div class="mag-wrap">\r\n    \t<h3></h3>\r\n    \t<ul class="mag-list main-magz">\r\n            <li>\r\n                        <div class="cover-wrap"><a href="https://www.magzter.com/IN/EFY-Enterprises-Pvt-Ltd/Electronics-For-You/Science/183025" onclick="ga(

答案 2 :(得分:0)

您可以覆盖jsonSerialize型号中的Parent功能:

public function jsonSerialize()
{
    return [
       'name' => $this->name,
       'children' => $this->children->pluck('value')->toArray(),
    ]
}

这样做,您将在调用toJson()方法或将模型作为json响应返回时(内部调用toJson())收到正确的输出。