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

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

但这段代码是错误的。它适用于所有记录。但事实是此查询适用于每个类别。请帮助我,谢谢


喵喵时光机
浏览 238回答 4
4回答

暮色呼如

有一个专门处理此问题的 Laravel 包,称为Eloquent Eager Limit:安装后:composer require staudenmeir/eloquent-eager-limit:"^1.0"您应该在应用有限预加载的模型中使用它:class PostModel extends Model{use \Staudenmeir\EloquentEagerLimit\HasEagerLimit; // ........}class CategoriesModelextends Model{use \Staudenmeir\EloquentEagerLimit\HasEagerLimit; // ........}现在这个查询将得到你想要的结果:$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;

梦里花落0921

首先,您的控制器中的关系名称是错误的。通过以下代码更新您的类别模型:public function ten_posts(){  return $this->hasMany(PostModel::class)->take(10);}然后使用以下代码更新您的控制器:$categories = CategoriesModel::with('ten_posts')->take(6)->get();

DIEA

尝试这样 -$categories = CategoriesModel::with(['pages' => function($query) {        $query->take('10');    }])->take("6")->get();
打开App,查看更多内容
随时随地看视频慕课网APP