当我以雄辩的方式查询数据时,当我使用stdClass函数时,它会返回get()
对象而不是Model的一个实例。
$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 instead of actual Model报告了同样的问题,但这是一个老话题,解决方案只是回到以前版本的Laravel。
发布于 2019-09-17 07:44:34
这是因为您使用了独立于您的模型和代码结构的\DB::table('users')
。这就像直接在数据库上运行查询一样,laravel不知道结果是一个完整的User
,包含所有的字段。
使用
$userGet = \App\User::query()
->where('id','=', 1)
->get()[0]
echo get_class($userGet) // -> App\User
//or simply
$userGet = \App\User::query()
->where('id','=', 1)
->first()
echo get_class($userGet) // -> App\User
发布于 2019-09-17 08:48:01
这不是因为使用了get()
方法。这是因为使用了DB
外观。
如果使用模型外观进行查询,每个对象都将转换为特定的模型对象。
get()
函数将返回一个Eloquent Collection
,而不是一个对象。
// this is a collection of users
$users = User::where('id', 1)->get();
因此,如果您想要从该集合中获得一个对象,可以在其后面调用first()
。
(而不是调用数组索引)。
// 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();
https://stackoverflow.com/questions/57977247
复制