使用Laravel 5.3查询生成器为子查询复制雄辩的ORM数据结构
我试图复制使用雄辩的ORM时得到的结果集,除了使用Laravel查询生成器。基本上,使用这段代码,我可以让包嵌套在产品中,这样当我在视图中循环它们时,我可以在每个产品中进一步循环包。看起来基本正确(见下面的结果集) 我尝试了几种使用查询生成器的方法来实现这一点,但它像我所想的那样内联地加入了包 使用Query Builder获得相同数组结构的最佳方法是什么?我知道结果集是一种不同类型的数组,这很好,但对于我的项目,此时必须使用Query Builder完成使用Laravel 5.3查询生成器为子查询复制雄辩的ORM数据结构,laravel,Laravel,我试图复制使用雄辩的ORM时得到的结果集,除了使用Laravel查询生成器。基本上,使用这段代码,我可以让包嵌套在产品中,这样当我在视图中循环它们时,我可以在每个产品中进一步循环包。看起来基本正确(见下面的结果集) 我尝试了几种使用查询生成器的方法来实现这一点,但它像我所想的那样内联地加入了包 使用Query Builder获得相同数组结构的最佳方法是什么?我知道结果集是一种不同类型的数组,这很好,但对于我的项目,此时必须使用Query Builder完成 谢谢。我想说,这就是为什么你有雄辩的
谢谢。我想说,这就是为什么你有雄辩的口才:你不必担心如何将这些关系结合在一起 但是,如果您真的想要达到相同的结果,我将使用两个表
用户
和消息
:
第一种方法:
检索用户并通过查询数据库中的关系对其进行转换:
$result = DB::table('users')->get()->transform(function ($user){
$user->messages = DB::table('messages')->where('user_id', $user->id)->get();
return $user;
});
缺点:有很多用户意味着在消息表上有很多db查询
上行:要写的代码更少
第二种方法:
使用用户的所有ID检索两个表以查询消息:
$users = DB::table('users')->get();
$messages = DB::table('messages')->whereIn('user_id', $users->pluck('id')->toArray())->get();
$result = $users->transform(function ($user) use ($messages){
$user->messages = $messages->where('user_id', $user->id)->values();
return $user;
});
缺点:仍然需要改变它
上行:数据库访问次数减少。i、 e只有两个问题
第三种方法
与第二个类似,只是您可以按“用户id”对消息进行分组,然后在转换用户时不进行额外筛选结果:
$user = DB::table('users')->get();
$messages = DB::table('messages')->whereIn('user_id', $user->pluck('id')->toArray())
->get()
->groupBy('user_id');
$result = $user->transform(function ($user) use ($messages){
$user->messages = $messages[$user->id];
return $user;
});
缺点:两个相同
优点:转换用户时无需额外筛选
其他方法
查询时同时连接用户和消息,然后转换响应,或者直接使用它
PS:Elount使用查询生成器
答案有待更新
回答得很好。谢谢你的帮助。
$user = DB::table('users')->get();
$messages = DB::table('messages')->whereIn('user_id', $user->pluck('id')->toArray())
->get()
->groupBy('user_id');
$result = $user->transform(function ($user) use ($messages){
$user->messages = $messages[$user->id];
return $user;
});