#php #laravel
Вопрос:
Я купил кучу моделей ::with('something')
. У меня есть коллекция этих моделей с нетерпеливо загруженной коллекцией. Я выполнил некоторую операцию над этой коллекцией, и теперь мне не нужно это отношение в моем окончательном выводе JSON.
Как я могу от него избавиться?
return Foo::with(['something'])->get(['id', 'content', 'target']);
Когда я возвращаю ответ JSON, я получаю 4 столбца (идентификатор, содержимое, цель и что-то еще). Мне нужны 3 колонки. Как избавиться от something
этого до окончательного возврата ответа?
Какой метод я должен использовать?
#relations: array:1 [
"something" => IlluminateDatabaseEloquentCollection {#1225
Редактировать:
->each(function (Foo $foo) {
unset($foo['something']);
})
->values();
Это делает свою работу, но выглядит не очень хорошо. Есть ли лучший способ?
Комментарии:
1. Работает ли для вас скрытие атрибутов в модели? laravel.com/docs/8.x/…
Ответ №1:
Вы можете map
( each
получить доступ) к содержимому и hide
отношению:
return Foo::with(['something'])
->get(['id', 'content', 'target'])
->each->makeHidden('something');
Ваш метод может сработать, но ИМО это не лучший вариант, потому что, если вы (например, в будущем) измените код и будете манипулировать отношением после unset
, то вы можете столкнуться с некоторыми проблемами, когда вместо hide
этого просто «скрываете» отношение (вы можете сделать то же самое с атрибутами) от сериализации
Вы можете найти документацию здесь
Если не ясно, почему и как ->each->...
это работает, проверьте здесь
Ответ №2:
Вы можете использовать transform
метод коллекций laravel.
return Foo::with(['something'])->get()->transform(function($item, $key){
return $item->only(['id', 'content', 'target']);
});