首页 > 解决方案 > 雄辩的 stdClass 对象返回数组?

问题描述

是否有一种内置方法可以从 eloquent 模型而不是 eloquent 集合返回标准类对象数组?例如,可以这样做:

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

然而,这似乎是不必要的开销,因为我们会将响应转换为一个雄辩的集合,然后转换为一个数组,然后 json 编码该数组,然后 json 解码该字符串......

我之所以使用此功能,是因为我正在拆分一个大型企业应用程序,该应用程序最初是使用控制器方法中的所有业务逻辑创建的(事实证明很难维护)。我在项目中强加了一个标准,即必须在该特定实体的服务类中执行对数据库的所有访问(使用雄辩的模型和查询构建器),并且从服务类返回的数据应该是原始 php 类型,这样如果决定用另一个 orm 替换 eloquent 或完全交换 mysql,这些服务类是唯一需要重写的东西(有点像存储库模式,但不是真的,因为服务类包含业务逻辑以及通过模型类访问数据库)

我想对此的一种解决方案可能是扩展基本的 eloquent 类以包含一种方法,例如toObj()(可能不是最好的名称......幸好我不在标准委员会;))

标签: phplaraveleloquent

解决方案


您可以尝试在模型水合之前下拉到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()


推荐阅读