【问题标题】:Eloquent HasMany relationship, with limited record countEloquent HasMany 关系,记录数有限
【发布时间】:2015-10-20 09:47:03
【问题描述】:

我想限制相关记录来自

$categories = Category::with('exams')->get();

这将使我获得所有类别的考试,但我想要的是从一个类别和每个类别中获得 5 次考试。

类别模型

public function Exams() {

    return $this->hasMany('Exam');
}

考试模式

public function category () {

return $this->belongsTo('Category');

}

我尝试了几件事,但无法让它发挥作用

首先我发现是这样的

$categories = Category::with(['exams' => function($exams){

   $exams->limit(5);

  }])->get();

但是这样做的问题是它只会从所有类别中获得 5 条记录。我也尝试为类别模型添加限制

public function Exams() {

return $this->hasMany('Exam')->limit(5);
}

但这并没有做任何事情,并且返回时没有限制 5。

那么有没有办法我可以用 Eloquent 做到这一点,或者我应该简单地加载所有内容(希望传递它)并使用 foreach 的 break?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    使用 Eloquent 的预加载无法做到这一点。您有以下选择:

    1. 获取包含所有考试的类别,每个类别只参加 5 次考试:

      $categories = Category::with('exams')->get()->map(function($category) {
        $category->exams = $category->exams->take(5);
        return $category;
      });
      

    应该没问题,只要你的数据库中没有太多的考试数据——“太多”会因项目而异,最好试试看它是否足够快。

    1. 仅获取类别,然后使用 $category->exams 为每个类别获取 5 个考试。这将导致执行更多查询 - 每个提取的类别额外查询一个。

    【讨论】:

    • 我尝试了第一个解决方案(带地图),但它给了我(var_dumped)array (size=4) 0 => null 1 => null 2 => null 3 => null,奇怪的是它应该工作(试图让它工作,但无论如何它都会给出 null,它只是迭代槽)。
    • 但是我会选择你的第二个解决方案,感谢你提到以后可能会派上用场的地图。
    • 对不起,示例中有一个蹩脚的错误,我忘记从 map() 返回,所以一切都设置为 null。刚刚修好了
    • 我在 5 分钟后发现了这一点(当我发布它时),但采用了第二种方法,再次感谢
    【解决方案2】:

    我只是在其中插入对我有用的小逻辑。

    $categories = Category::with('exams');
    

    第 1 步:我计算响应的记录数

    $totalRecordCount = $categories->count()
    

    第 2 步:在 with 函数中传递总数

    $categories->with([
      'exams' => function($query) use($totalRecordCount){
          $query->take(5*$totalRecordCount);
      }
    ])
    

    第 3 步:现在您可以根据需要检索结果

    $categories->get();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 2016-03-17
      • 1970-01-01
      • 2017-09-14
      • 2015-12-23
      • 2022-11-23
      • 2015-12-22
      相关资源
      最近更新 更多