php - 如何从 foreach 内的查询中传递数组
问题描述
我有以下查询将带来所有 Auth 用户朋友:
$usrusrmembs = DB::table('usrusrs')
->where('accepted', 1)
->where('user_id', $u_id)
->orwhere('friend_id', $u_id)
->pluck('friend_id', 'user_id');
接下来是一个 foreach 循环从上述查询接收到的 id,获取所有 Id 的帖子,然后将结果发送到刀片:
foreach($usrusrmembs as $key => $val){
$rec_users = ($key == $u_id) ? $val : $key;
$f_usrs_psts = DB::table('posts')
->where('posts.user_id', $rec_users)
->get();
}
return view('updates', ['f_posts' => $f_usrs_psts] );
刀片中的输出仅显示一个朋友的帖子,而忽略其他人。我觉得帖子查询中存在问题,它只向刀片发送最后处理的 ID。如果这是问题,那我该如何解决?
解决方案
这就是 Laravel 真正闪耀的地方。利用这些关系并通过预加载在一个查询中完成所有操作。我不知道您的模型关系是什么,但是是这样的:
$usrusrmembs = \App\UserUserModel::where('accepted', 1)
->where('user_id', $u_id)
->orwhere('friend_id', $u_id)
->with('posts')
->get();
如果你想要更多的控制,你可以使用闭包 和 的组合whereHas
,但是上面的这个应该让你接近。然后,在您看来,您可以循环查看每个帖子:
@foreach($usrusrmembs as $usr)
echo $usr-name // etc
@foreach ($usr->posts as $post)
echo $post->whatever
@endforeach
@endforeach
这不会为您提供所需的确切内容,但该想法应该可以帮助您完成它,并且您可以通过删除控制器中的 foreach 循环来跳过整个 n+1 问题。