Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Laravel 5.3查询生成器为子查询复制雄辩的ORM数据结构_Laravel - Fatal编程技术网

使用Laravel 5.3查询生成器为子查询复制雄辩的ORM数据结构

使用Laravel 5.3查询生成器为子查询复制雄辩的ORM数据结构,laravel,Laravel,我试图复制使用雄辩的ORM时得到的结果集,除了使用Laravel查询生成器。基本上,使用这段代码,我可以让包嵌套在产品中,这样当我在视图中循环它们时,我可以在每个产品中进一步循环包。看起来基本正确(见下面的结果集) 我尝试了几种使用查询生成器的方法来实现这一点,但它像我所想的那样内联地加入了包 使用Query Builder获得相同数组结构的最佳方法是什么?我知道结果集是一种不同类型的数组,这很好,但对于我的项目,此时必须使用Query Builder完成 谢谢。我想说,这就是为什么你有雄辩的

我试图复制使用雄辩的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;
});