我有两个模型。PostModel和CategoriesModel。
class PostModel extends Model
{
protected $table='posts';
protected $primaryKey = 'id';
protected $guarded=['id'];
public function categories()
{
return $this->belongsTo(CategoriesModel::class);
}
}
class CategoriesModelextends Model
{
protected $table='categories';
protected $primaryKey = 'id';
protected $guarded=['id'];
public function posts()
{
return $this->hasMany(PostModel::class);
}
}
我想得到6个类别和10个帖子。我在我的控制器中使用了此代码
$categories = CategoriesModel::with(['pages' => function($query) {
$query->limit('10');
}])->take("6")->get();
但是这个代码是错误的。它适用于所有记录。但事实是,这个查询适用于每一个类别。请帮帮我。谢谢
有一个专门用于此的laravel包,称为Eloquent Eagle Limit:
安装后:
composer require staudenmeir/eloquent-eager-limit:"^1.0"
您应该在应用有限热切加载的模型中使用它:
class PostModel extends Model
{
use StaudenmeirEloquentEagerLimitHasEagerLimit;
// ........
}
class CategoriesModel
extends Model
{
use StaudenmeirEloquentEagerLimitHasEagerLimit;
// ........
}
现在这个查询将得到您想要的结果:
$categories = CategoriesModel::with(['pages' => function($query) {
$query->limit('10');
}])->take("6")->get();
对于热切加载,您可以使用映射操作来完成此操作:
$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;
首先,您的关系名称在控制器中是错误的。通过以下代码更新您的类别模型:
public function ten_posts()
{
return $this->hasMany(PostModel::class)->take(10);
}
然后用以下代码更新控制器:
$categories = CategoriesModel::with('ten_posts')->take(6)->get();
这样尝试-
$categories = CategoriesModel::with(['pages' => function($query) {
$query->take('10');
}])->take("6")->get();