我正在尝试复制使用Eloquent ORM时得到的结果集,但Laravel Query Builder除外。基本上使用这个代码我可以让包看起来嵌套在产品中,这样当我在视图上循环它时,我可以进一步循环每个产品中的包。看起来很基本(见下面的结果集)。
$get_posts_for_product = Product::where('active', 1)
->with('packs')
->get()->toArray();
我已经尝试了一些使用查询生成器来实现此功能的方法,但它按照我的想法将内联接入内联。
使用查询生成器获取相同数组结构的最佳方法是什么,我知道结果集是一种不同类型的数组,这很好,但对于我的项目,此时必须使用查询生成器完成。
感谢。
答案 0 :(得分:1)
我想说,这就是为什么你有Eloquent:你不必担心如何将这些关系融合在一起。
但是,如果您真的希望获得相同的结果,我将使用两个表users
和messages
来演示:
第一种方法:
通过查询数据库中的关系来检索用户并对其进行转换:
$result = DB::table('users')->get()->transform(function ($user){
$user->messages = DB::table('messages')->where('user_id', $user->id)->get();
return $user;
});
下行:拥有多个用户意味着在消息表上进行大量的数据库查询。
上升:更少的代码
第二种方法:
使用所有用户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;
});
下行:仍然需要对其进行转换。
上行:减少数据库访问次数。只有两个查询。
第三种方法
看起来像第二个,除了您可以通过' user_id'那么在转换users
结果时不会有额外的过滤器:
$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:Eloquent使用查询构建器。
答案是开放的更新。