雄辩的stdClass对象返回数组?

时间:2018-07-24 20:06:12

标签: php laravel eloquent

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

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

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

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

我想解决这个问题的一种方法可能是扩展基本的雄辩类,使其包含诸如toObj()之类的方法(可能不是最好的名字……好东西我不在标准委员会上;)

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

You can try to drop down to the Query\Builder instance on the Eloquent\Builder and get the records before models are hydrated.

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

This returns the result that has been built up so far using Query\Builder@get directly, which returns a collection of stdClass objects, instead of Eloquent\Builder@get which will end up calling Query\Builder@get anyway to hydrate model instances.

You would have to check to make sure what is being called in Eloquent\Builder@get isn't needed for the particular query you are doing. example: Global scopes App\User::...->applyScopes()->getQuery()->get()