Есть ли встроенный способ вернуть массив стандартных объектов класса из красноречивой модели вместо красноречивой коллекции? Например, можно сделать:
return json_decode(json_encode(\App\User::where('status', 'active')
->get()->toArray()));
Однако это кажется ненужными накладными расходами, поскольку мы преобразуем ответ в красноречивую коллекцию, затем в массив, затем json, кодирующий этот массив, а затем json, декодирующий эту строку ...
Причина, по которой я предпочитаю эту функциональность, заключается в том, что я нахожусь в процессе разрушения большого корпоративного приложения, которое изначально было создано со всей бизнес-логикой в методах контроллера (что оказывается трудным в обслуживании). Я навязываю в рамках проекта стандарт, согласно которому весь доступ к базе данных (с использованием красноречивых моделей и построителя запросов) должен выполняться в классе обслуживания этой конкретной сущности, и что данные, возвращаемые из классов обслуживания, должны иметь примитивные типы php, так что если решение когда-либо сводится к замене eloquent другим orm или полной замене mysql, эти классы обслуживания - единственное, что нужно будет переписать для этого (вроде как шаблон репозитория, но не совсем так, поскольку классы обслуживания содержат бизнес логика, а также доступ к базе данных через классы моделей)
Я полагаю, что одним из решений этого могло бы стать расширение базового класса красноречивых, чтобы он содержал такой метод, как toObj() (вероятно, не лучшее название ... хорошо, что я не в комитете по стандартам;))






Ты можешь использовать
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);
В этом случае вы бы изменили запрос на DB::table("organizations")->where("user_id", 2)->get(); (или использовали ->join() и т. д. И т. Д.). Есть варианты, чтобы справиться с этим.
Не вернет ли ваш последний пример строку json, тогда как мне нужен массив простых старых объектов php? Или я запуталась? (скорее всего так)
Ах да, извините, он вернет строку JSON, поэтому вы просто оберните ее в response()... в json_decode(). Я добавил правку, так как при возврате ответа JSON, скорее всего, есть какое-то взаимодействие с моделями, а не просто json_encode, отправляющий его.
В основном классе toJson() есть метод Model, но, к сожалению, он также следует за toArray() перед преобразованием в json.
Вы можете попробовать перейти к экземпляру 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() и это именно то, что мне нужно!
Я понимаю. Это может быть решением для некоторых случаев, но в настоящее время у нас есть код, использующий отношения моделей (от контроллеров, а не представлений), например, что-то вроде
\App\User::find(2)->organizations()->get(). : /