我有两个表。学校和学生。
当我拿到所有学生时
Student::all()->toJson();
我收到的回复
[
{
"id": 1,
"school_id": 1,
"name": "Jhon"
}
]
但实际上我想收到
[
{
"id": 1,
"school": {
"id": 1
},
"name": "Jhon"
}
]
我知道我可以做
Student::with(['school']);
但它会对学校表进行额外的查询,这是不必要的,因为我只需要学校id,而不需要所有其他属性。
您可以覆盖模型中的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;
}
您可以使用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
方法以使用新的扩展类。