如何在laravel中的with()方法之后限制查询



我有两个模型。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();

最新更新