Php 使用laravel elequent内部循环

Php 使用laravel elequent内部循环,php,laravel,performance,eloquent,Php,Laravel,Performance,Eloquent,我在循环内有一个查询,如下所示: $users = User::all(); foreach($users as $user) { $posts = Posts::where('status', 1)->where('user_id', $user->id)->get(); // do some thing .. } 我将上述代码段转换为以下代码: $users = User::all(); $posts_tmp = Posts::where('stat

我在循环内有一个查询,如下所示:

$users = User::all();

foreach($users as $user) {
     $posts = Posts::where('status', 1)->where('user_id', $user->id)->get();
     // do some thing ..
}
我将上述代码段转换为以下代码:

$users = User::all();
$posts_tmp = Posts::where('status', 1);

foreach($users as $user) {
     $posts = $posts_tmp->where('user_id', $user->id)->get();
     // do some thing ..
}
在第二种方法中,我创建了模型外部循环的新对象,并使用where-inside循环

这个代码段快吗

性能提高了吗

第二种方法是运行查询一次

注意:我的问题是关于这两个代码片段的,所以其他解决方案,如使用
关系
with()
函数,对我来说并不合适


这两个查询都是n+1查询

您的查询将全部转换为:

从用户中选择*;
从状态为1且用户id为1的帖子中选择*;
从状态为1且用户id为2的帖子中选择*;
从状态为1、用户id为3的帖子中选择*;
...
与快速加载一样,您可以使用
而不是循环:

$users=User::all();
$posts=posts::where('status',1)->其中('user_id',$users->pulk('id')->toArray();
因此,查询将转换为如下两个sql查询:

从用户中选择*;
从状态为1且用户id为(1,2,3,…)的帖子中选择*;