首页 > 解决方案 > 如何从 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。如果这是问题,那我该如何解决?

标签: phplaravel

解决方案


这就是 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 问题。


推荐阅读