0

我有两张桌子。学校和学生。

当我获取所有学生时

Student::all()->toJson();

我得到回应

[
  {
    "id": 1,
    "school_id": 1,
    "name": "Jhon"
  }
]

但实际上我想收到

[
  {
    "id": 1,
    "school": {
        "id": 1
    },
    "name": "Jhon"
  }
]

我知道我能做到

Student::with(['school']);

但是随后它对学校表进行了额外的查询,这不是必需的,因为我只需要学校 ID,而不需要所有其他属性。

4

2 回答 2

1

您可以覆盖toArray模型中的方法。同样的事情也可以用toJson,但是toArray被调用toJson,在我看来,这样做更好toArray

class Student extends Eloquent {

    public function toArray($options = 0){
        $this->school = ['id' => $this->school_id];
        unset($this->school_id);

        return parent::toArray($options);
    }
}

编辑

保持模型相同并且只更改输出(这可能更好)

public function toArray($options = 0){
    $array = parent::toArray($options);
    $array['school'] = ['id' => $array['school_id']];
    unset($array['school_id']);
    return $array;
}
于 2014-11-11T12:07:04.167 回答
1

您可以使用Illuminate\Support\Collection'transform方法获得更自动化的解决方案:

$students = Student::all();

$students->transform(function($el) {
    $el = $el->toArray();

    foreach ($el as $k => $v) {
        if (substr($k, -3) === '_id') {
            $el[substr($k, 0, -3)]['id'] = $v;

            unset($el[$k]);
        }
    }

    return $el;
});


return $students;

如果你要多次调用它(我假设你会这样做),最好的办法是扩展Illuminate\Database\Eloquent\Collection并添加一个方法来做到这一点。然后编辑newCollection基础模型上的方法以使用新的扩展类。

于 2014-11-11T12:26:21.230 回答