【问题标题】:Laravel 5.1: Eloquent relationship hasmany, Limit recordsLaravel 5.1:Eloquent 关系hasmany,限制记录
【发布时间】:2021-04-20 02:35:11
【问题描述】:

我有一个 Laravel 5.1 的问题:Eloquent 关系 hasmany,限制记录我有 2 个表:feeds,cmets。请求是根据每个特定的提要获得 5 个提要和 cmet。我目前正在使用以下查询:

public function getFeed($user_id){
    return Feed::whereUserId($user_id)->with(['comments'])->take(10)->get()->map(function ($feed) {
        $feed->comments = $feed->comments->take(5);
        return $feed;
    });
}

但是,它会返回所有的 cmets。

我的想法是$feed->comments = $feed->comments->take(5); 行不起作用。我只想为每个饲料获得5 cmets,您有什么建议吗?任何 cmets 都受到高度赞赏。谢谢!

【问题讨论】:

    标签: laravel-5


    【解决方案1】:

    迟到总比没有好,我昨天遇到了同样的问题,最后在模型上设置了整个关系数组。

    所以你的情况是这样的:

    return Feed::whereUserId($user_id)->take(10)->get()->map(function($feed) {
             $feed->setRelation('comments', $feed->comments->take(5));
             return $feed;
    });
    

    【讨论】:

      【解决方案2】:

      我已经面临同样的问题一个多月了。我只是想优化查询,因为从 100 万条记录中加载所需数据大约需要 1.5 秒。

      我利用了Eloquent ORM Collection Load() 方法。这将加载时间减少到仅 300 毫秒。

      在你的情况下,

      return Feed::whereUserId($user_id)
          ->get()
          ->each(function ($feed) {
              $feed->load('comments')->take(5);
          })
      });
      

      【讨论】:

      • 我认为limit/take需要像这样$feed->load(['comments' => function ($query) { $query->take(5); }]);在load函数参数中定义
      【解决方案3】:

      如果它适用于所有情况,您可以像这样调整 Feed 模型中的关系:

      public function comments() {
          return $this->hasMany('App\Comment')->limit(5);
      }
      

      【讨论】:

      • 这不起作用,如果您在->with() 方法中使用它,它将限制整个查询。因此,作为一个整体,你只会得到 5 个 cmets,而实际上你想要“每个”父关系 5 个 cmets。
      【解决方案4】:
      $feed= Feed::whereUserId($userId)->with(['comments'])->get()->map(function ($query) {
                  $query->setRelation('comments', $query->comments->take(10));
                  return $query;
              });
      

      【讨论】:

      • 请在您的代码中添加一些解释,以便对提出问题的人有所帮助
      【解决方案5】:
      Feed::whereUserId($user_id)->with([
          'comments' => function($query) {
               // You should limit the comments by editing the
               // relationships query not the main query.
               $query->take(5);
          }
      ])->take(10)->get();
      

      通过这种方式,您可以限制所需的提要数和每个提要的评论数。

      【讨论】:

      • 这将限制 fid 而不是 cmets
      • 不,这会限制他们俩
      • whit 不起作用,此代码将限制 Feed 10,并且只会获得 5 个 cmets,并将与 10 个 Feed 共享它们
      【解决方案6】:

      错误可能在这里

      $feed->comments = $feed->comments->take(5);

      应该是这样的

      $feed->comments = $feed->comments->take(5)->get();

      我会建议你这样写

      $feed->load(['comments' => function($query){ return $query->take(5); }])

      【讨论】:

      • take() 是一个令人困惑的函数:它映射到limit() 用于查询实例,并且在集合实例上调用它时与查询无关。我建议仅在使用集合实例时使用它。在这种情况下,您永远不需要调用 ->get(),因为这意味着集合中的不同内容。
      猜你喜欢
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 2015-12-23
      • 2017-09-14
      相关资源
      最近更新 更多