Php 如何从foreach中的查询传递数组

Php 如何从foreach中的查询传递数组,php,laravel,Php,Laravel,我有以下查询,将带来所有Auth用户朋友: $usrusrmembs = DB::table('usrusrs') ->where('accepted', 1) ->where('user_id', $u_id) ->orwhere('friend_id', $u_id) ->

我有以下查询,将带来所有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的POST,然后将结果发送到刀片服务器:

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] );

刀片中的输出仅显示一个朋友的帖子,而忽略其他朋友的帖子。我觉得posts查询中存在一个问题,它只向刀片服务器发送最后处理的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问题。

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

一般来说,您希望避免在循环中执行查询。例如,如果
$usrusrmembs
包含1000个值,则对数据库进行1000次调用。我将修改您的初始查询,以便在一次调用中获得您需要的所有结果。另外,您在哪里定义了
$f_usrs\psts
?您只得到一个结果,因为您覆盖了foreach循环中的
$f_usrs\psts
变量。一般来说,您希望避免在循环中执行查询。例如,如果
$usrusrmembs
包含1000个值,则对数据库进行1000次调用。我将修改您的初始查询,以便在一次调用中获得您需要的所有结果。另外,您在哪里定义了
$f_usrs\psts
?您只得到一个结果,因为您覆盖了foreach循环中的
$f_usrs\psts
变量。非常感谢您的澄清。我正在尝试执行此解决方案,但收到了(对未定义方法illumb\Database\Query\Builder::posts()的调用)。我在POST和usrusr模型之间没有关系,因为usrusr是友谊表。不过,用户表与这两个表都相关。听起来您可能希望重新思考一下您的体系结构。我可能建议您将usrusr模型作为用户模型的扩展,然后发布文章。或者,如果usrusr与User是同一个表,只需在usrusr上添加
posts
作为关系即可。不管是哪种方式,我认为拥有这种关系会让你的生活变得更容易——你可以用你的观点来看待这种关系,就像我的回答:)非常感谢你的澄清。我正在尝试执行此解决方案,但收到了(对未定义方法illumb\Database\Query\Builder::posts()的调用)。我在POST和usrusr模型之间没有关系,因为usrusr是友谊表。不过,用户表与这两个表都相关。听起来您可能希望重新思考一下您的体系结构。我可能建议您将usrusr模型作为用户模型的扩展,然后发布文章。或者,如果usrusr与User是同一个表,只需在usrusr上添加
posts
作为关系即可。不管是哪种方式,我认为拥有这种关系会让你的生活变得更容易——你可以用你的观点来看待这种关系,就像我的回答:)