为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
喵喵时光机 2023-08-26 17:34:21
我有 2 个型号。帖子模型和类别模型。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();但这段代码是错误的。它适用于所有记录。但事实是此查询适用于每个类别。请帮助我,谢谢
查看完整描述

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();


查看完整回答
反对 回复 2023-08-26
?
忽然笑

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;


查看完整回答
反对 回复 2023-08-26
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

首先,您的控制器中的关系名称是错误的。通过以下代码更新您的类别模型:


public function ten_posts()

{

  return $this->hasMany(PostModel::class)->take(10);

}

然后使用以下代码更新您的控制器:


$categories = CategoriesModel::with('ten_posts')->take(6)->get();


查看完整回答
反对 回复 2023-08-26
?
DIEA

TA贡献1820条经验 获得超2个赞

尝试这样 -


$categories = CategoriesModel::with(['pages' => function($query) {

        $query->take('10');

    }])->take("6")->get();


查看完整回答
反对 回复 2023-08-26
  • 4 回答
  • 0 关注
  • 222 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信