使用Laravel 5.3 Query Builder为Sub Query复制Eloquent ORM数据结构

时间:2017-11-11 14:54:50

标签: laravel

我正在尝试复制使用Eloquent ORM时得到的结果集,但Laravel Query Builder除外。基本上使用这个代码我可以让包看起来嵌套在产品中,这样当我在视图上循环它时,我可以进一步循环每个产品中的包。看起来很基本(见下面的结果集)。

        $get_posts_for_product = Product::where('active', 1)
                 ->with('packs')
                 ->get()->toArray();

enter image description here

我已经尝试了一些使用查询生成器来实现此功能的方法,但它按照我的想法将内联接入内联。

使用查询生成器获取相同数组结构的最佳方法是什么,我知道结果集是一种不同类型的数组,这很好,但对于我的项目,此时必须使用查询生成器完成。

感谢。

1 个答案:

答案 0 :(得分:1)

我想说,这就是为什么你有Eloquent:你不必担心如何将这些关系融合在一起。

但是,如果您真的希望获得相同的结果,我将使用两个表usersmessages来演示:

第一种方法:

通过查询数据库中的关系来检索用户并对其进行转换:

$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使用查询构建器。

     

答案是开放的更新。