Laravel Eloquent ORM 返回 stdClass 而不是 Model 实例

get()当我用 eloquent 查询数据时,它在使用该函数时返回 stdClass 对象而不是我的模型实例。


$userFind = User::find(1)

$userGet  = DB::table('users')

            ->where('users.id','=', 1)

            ->select('users.*')->get()[0]


echo get_class($userFind) // -> App\User

echo get_class($userGet) // -> stdClass

Laravel Eloquent ORM returnig stdClass 而不是实际的 Model报告了同样的问题,但这是一个老话题,解决方案只是回到 Laravel 的先前版本。


慕慕森
浏览 200回答 2
2回答

叮当猫咪

这是因为您使用\DB::table('users')的是独立于您的模型和代码结构的。这就像直接在数据库上运行查询一样,laravel 无法知道结果是User包含所有字段的完整结果。利用$userGet = \App\User::query()    ->where('id','=', 1)    ->get()[0]echo get_class($userGet) // -> App\User

撒科打诨

这不是因为使用get()方法。这是因为使用了DB门面。如果您使用模型外观进行查询,则每个对象都将转换为特定的模型对象。该get()函数将返回一个Eloquent Collection而不是一个对象。// this is a collection of users$users = User::where('id', 1)->get();因此,如果您想要该集合中的一个对象,您可以first()在它之后调用。(而不是调用数组索引 [0] )。// this one is ok too.// but it's not recommended.$user = User::where('id', 1)->get()[0];// this is proper way$user = User::where('id', 1)->get()->first();如果您确定只有一行符合您的条件,您可以调用first()而不是get().$user = User::where('id', 1)->first();
打开App,查看更多内容
随时随地看视频慕课网APP