Красноречивый возвращаемый массив объектов stdClass?

Есть ли встроенный способ вернуть массив стандартных объектов класса из красноречивой модели вместо красноречивой коллекции? Например, можно сделать:

return json_decode(json_encode(\App\User::where('status', 'active')
                ->get()->toArray()));

Однако это кажется ненужными накладными расходами, поскольку мы преобразуем ответ в красноречивую коллекцию, затем в массив, затем json, кодирующий этот массив, а затем json, декодирующий эту строку ...

Причина, по которой я предпочитаю эту функциональность, заключается в том, что я нахожусь в процессе разрушения большого корпоративного приложения, которое изначально было создано со всей бизнес-логикой в ​​методах контроллера (что оказывается трудным в обслуживании). Я навязываю в рамках проекта стандарт, согласно которому весь доступ к базе данных (с использованием красноречивых моделей и построителя запросов) должен выполняться в классе обслуживания этой конкретной сущности, и что данные, возвращаемые из классов обслуживания, должны иметь примитивные типы php, так что если решение когда-либо сводится к замене eloquent другим orm или полной замене mysql, эти классы обслуживания - единственное, что нужно будет переписать для этого (вроде как шаблон репозитория, но не совсем так, поскольку классы обслуживания содержат бизнес логика, а также доступ к базе данных через классы моделей)

Я полагаю, что одним из решений этого могло бы стать расширение базового класса красноречивых, чтобы он содержал такой метод, как toObj() (вероятно, не лучшее название ... хорошо, что я не в комитете по стандартам;))

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
4 843
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ты можешь использовать

DB::table("user")->where("status", "active")->get()->toArray();

Использование DB::table("user") вместо User:: вернет Collection объектов stdClass вместо Collection моделей User. (или одиночный, зависит от закрытия, ->get() против ->first())

Просто имейте в виду, что вы потеряете доступ к любым отношениям или функциям, как определено в модели User.

Я должен добавить это

return json_decode(json_encode(\App\User::where('status', 'active')->get()->toArray()));

Возможно, можно преобразовать в

$records = \App\User::where('status', 'active')->get()
return response()->json($records);

Я понимаю. Это может быть решением для некоторых случаев, но в настоящее время у нас есть код, использующий отношения моделей (от контроллеров, а не представлений), например, что-то вроде \App\User::find(2)->organizations()->get(). : /

whitwhoa 24.07.2018 22:16

В этом случае вы бы изменили запрос на DB::table("organizations")->where("user_id", 2)->get(); (или использовали ->join() и т. д. И т. Д.). Есть варианты, чтобы справиться с этим.

Tim Lewis 24.07.2018 22:17

Не вернет ли ваш последний пример строку json, тогда как мне нужен массив простых старых объектов php? Или я запуталась? (скорее всего так)

whitwhoa 24.07.2018 22:26

Ах да, извините, он вернет строку JSON, поэтому вы просто оберните ее в response()... в json_decode(). Я добавил правку, так как при возврате ответа JSON, скорее всего, есть какое-то взаимодействие с моделями, а не просто json_encode, отправляющий его.

Tim Lewis 24.07.2018 22:28

В основном классе toJson() есть метод Model, но, к сожалению, он также следует за toArray() перед преобразованием в json.

Oluwatobi Samuel Omisakin 24.07.2018 23:13
Ответ принят как подходящий

Вы можете попробовать перейти к экземпляру Query\Builder на Eloquent\Builder и получить записи до того, как модели будут гидратированы.

\App\User::where('status', 'active')->getQuery()->get();

Это возвращает результат, который был построен до сих пор с использованием Query\Builder@get напрямую, который возвращает коллекцию объектов stdClass, вместо Eloquent\Builder@get, который в любом случае вызовет Query\Builder@get для гидратации экземпляров модели.

Вам нужно будет убедиться, что то, что вызывается в Eloquent\Builder@get, не требуется для конкретного запроса, который вы выполняете. пример: Global scopes App\User::...->applyScopes()->getQuery()->get()

Бросьте ->toArray() после get() и это именно то, что мне нужно!

whitwhoa 25.07.2018 15:23

Другие вопросы по теме