4 回答
TA贡献1853条经验 获得超9个赞
有一个专门处理此问题的 Laravel 包,称为Eloquent Eager Limit:
安装后:
composer require staudenmeir/eloquent-eager-limit:"^1.0"
您应该在应用有限预加载的模型中使用它:
class PostModel extends Model
{
use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
// ........
}
class CategoriesModel
extends Model
{
use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
// ........
}
现在这个查询将得到你想要的结果:
$categories = CategoriesModel::with(['pages' => function($query) {
$query->limit('10');
}])->take("6")->get();
TA贡献1806条经验 获得超5个赞
对于急切加载,您可以使用地图操作执行以下操作:
$categories = CategoriesModel::with('pages')->take(6)->get()
->map(function($q)
{ $q->pages = $q->pages->take(10); // take only 10 query
return $q;
}
);
上述方法之所以必要,是因为受约束的预加载查询大致可转换为 SQL,如下所示:
查询选择类别:
select * from `categories`
limit 6;
查询以获取关系
select * from `categories`
inner join `posts` on `categories`.`id` = `posts`.`category_id`
where `posts`.`category_id` in (id's from categories query)
limit 10;
TA贡献1772条经验 获得超6个赞
首先,您的控制器中的关系名称是错误的。通过以下代码更新您的类别模型:
public function ten_posts()
{
return $this->hasMany(PostModel::class)->take(10);
}
然后使用以下代码更新您的控制器:
$categories = CategoriesModel::with('ten_posts')->take(6)->get();
TA贡献1820条经验 获得超2个赞
尝试这样 -
$categories = CategoriesModel::with(['pages' => function($query) {
$query->take('10');
}])->take("6")->get();
- 4 回答
- 0 关注
- 222 浏览
添加回答
举报