php - 雄辩的 stdClass 对象返回数组?
问题描述
是否有一种内置方法可以从 eloquent 模型而不是 eloquent 集合返回标准类对象数组?例如,可以这样做:
return json_decode(json_encode(\App\User::where('status', 'active')
->get()->toArray()));
然而,这似乎是不必要的开销,因为我们会将响应转换为一个雄辩的集合,然后转换为一个数组,然后 json 编码该数组,然后 json 解码该字符串......
我之所以使用此功能,是因为我正在拆分一个大型企业应用程序,该应用程序最初是使用控制器方法中的所有业务逻辑创建的(事实证明很难维护)。我在项目中强加了一个标准,即必须在该特定实体的服务类中执行对数据库的所有访问(使用雄辩的模型和查询构建器),并且从服务类返回的数据应该是原始 php 类型,这样如果决定用另一个 orm 替换 eloquent 或完全交换 mysql,这些服务类是唯一需要重写的东西(有点像存储库模式,但不是真的,因为服务类包含业务逻辑以及通过模型类访问数据库)
我想对此的一种解决方案可能是扩展基本的 eloquent 类以包含一种方法,例如toObj()
(可能不是最好的名称......幸好我不在标准委员会;))
解决方案
您可以尝试在模型水合之前下拉到Query\Builder
实例并获取记录。Eloquent\Builder
\App\User::where('status', 'active')->getQuery()->get();
这将返回迄今为止Query\Builder@get
直接使用构建的结果,它返回一个stdClass
对象集合,而不是Eloquent\Builder@get
最终调用Query\Builder@get
以水合模型实例。
您必须检查以确保Eloquent\Builder@get
您正在执行的特定查询不需要调用的内容。示例:全局范围App\User::...->applyScopes()->getQuery()->get()
推荐阅读
- c++ - MSVC __debugbreak() 与 openGL 错误回调一起使用时不会产生调用堆栈
- c++ - nullptr 和 boolean 之间的比较
- c++ - 使用简单的两阶段锁定的并发程序
- python - Mac 终端显示两个不同版本的 Python
- node.js - 没有得到猫鼬模型的响应。find()查询
- python - Pandas 中的同比增长列计算
- karate - 即使定位器在 DOM 中可用,Assert exists().exists 也会返回评估为 false 的断言
- android - 使用地图框:错误(评估'MapboxGL.StyleURL')
- python - 使用 print(", ".join(my_array)) 提取单个字符串并将其添加到 streamlit markdown。我没有得到字符串,而是得到了 NONE
- docker - 在 docker build 中打印 ARG 值