我想限制来自
的相关记录$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?
答案 0 :(得分:4)
使用Eloquent的急切加载无法做到这一点。你有的选择是:
获取包含所有示例的类别,并为每个示例仅进行5次检查:
$categories = Category::with('exams')->get()->map(function($category) {
$category->exams = $category->exams->take(5);
return $category;
});
只要您的数据库中没有太多的考试数据,这应该没问题 - "太多"项目之间会有所不同,最好试一试,看看它是否足够快。
答案 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();