Красноречивый объект ORM

У меня есть две таблицы. Школа и Студент.

Когда я получу всех студентов

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

Я получаю ответ с

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

Но на самом деле я хотел бы получить

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

Я знаю, что мог сделать

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

Но тогда он делает дополнительный запрос к школьной таблице, который не является необходимым, поскольку мне нужен только школьный идентификатор, а не все другие атрибуты.

0

Решение

Вы можете переопределить 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;
}
1

Другие решения

Ты можешь использовать 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 метод вашей базовой модели, чтобы использовать новый расширенный класс.

1

По вопросам рекламы [email protected]