【问题标题】:How to pass an array from a query inside a foreach如何从foreach中的查询传递数组
【发布时间】:2019-08-02 19:15:56
【问题描述】:

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

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。如果是这个问题,那我该如何解决呢?

【问题讨论】:

  • 作为一般经验法则,您希望避免在循环中执行查询。例如,如果$usrusrmembs 包含 1000 个值,则您正在对数据库进行 1000 次调用。我会重新处理您的初始查询,以便在一次调用中获得您需要的所有结果。另外,你在哪里定义了$f_usrs_psts
  • 您只得到 1 个结果,因为您覆盖了 foreach 循环中的 $f_usrs_psts 变量。

标签: php laravel


【解决方案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 问题。

【讨论】:

  • 非常感谢您的澄清。我正在尝试执行此解决方案,但我收到了(调用未定义的方法 Illuminate\Database\Query\Builder::posts())。我在帖子和 usrusr 模型之间没有关系,因为 usrusr 是友谊表。不过,用户表与这两个表相关。
  • 听起来您可能希望重新考虑一下您的架构。我可能会建议您将 usr 模型作为 User 模型的扩展,然后发布帖子。或者,如果 usrUser 是同一个表,只需在 usr 上添加 posts 作为关系。无论哪种方式,我认为建立这种关系会让你的生活更轻松——你可以像我的回答一样急切地加载,也可以简单地在你的视图中调用这种关系:)
猜你喜欢
  • 1970-01-01
  • 2020-10-20
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
相关资源
最近更新 更多