Как избавиться от ненужного поля (отношения) из коллекции Красноречивых моделей?

#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']);
    });