Laravel 4 - Eloquent relationship hasmany,Limit records

时间:2015-07-29 12:08:23

标签: laravel laravel-4 eloquent one-to-many sql-limit

我想限制来自

的相关记录
$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做到这一点,或者我应该简单地加载所有内容(想传递它)并使用break与foreach?

2 个答案:

答案 0 :(得分:4)

使用Eloquent的急切加载无法做到这一点。你有的选择是:

  1. 获取包含所有示例的类别,并为每个示例仅进行5次检查:

    $categories = Category::with('exams')->get()->map(function($category) {
      $category->exams = $category->exams->take(5);
      return $category;
    });
    
  2. 只要您的数据库中没有太多的考试数据,这应该没问题 - "太多"项目之间会有所不同,最好试一试,看看它是否足够快。

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

答案 1 :(得分:1)

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

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

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

$totalRecordCount = $categories->count()

第2步:在with函数内部传递总数

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

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

$categories->get();