У меня есть две таблицы. Школа и Студент.
Когда я получу всех студентов
Student::all()->toJson();
Я получаю ответ с
[
{
"id": 1,
"school_id": 1,
"name": "Jhon"}
]
Но на самом деле я хотел бы получить
[
{
"id": 1,
"school": {
"id": 1
},
"name": "Jhon"}
]
Я знаю, что мог сделать
Student::with(['school']);
Но тогда он делает дополнительный запрос к школьной таблице, который не является необходимым, поскольку мне нужен только школьный идентификатор, а не все другие атрибуты.
Вы можете переопределить 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
«s 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
метод вашей базовой модели, чтобы использовать новый расширенный класс.