如何在Laravel模型的$with属性中添加limit()限制?
Laravel模型$with属性中限制预加载关联数量的解决办法
你之前的写法报错,是因为$with属性的数组元素只支持关联名称字符串(比如'user')或者带字段选择的字符串(比如'user:id,display_name'),不能直接传闭包进去。要实现需求,有两种靠谱的方式:
方式一:自定义带限制的关联方法
在模型里新增一个带数量限制的关联方法,然后在$with里引用它:
// 定义带限制的关联(根据实际关联类型调整,比如hasMany/belongsToMany等) public function limitedLawyers() { return $this->hasMany(Lawyer::class)->limit(4); } // 配置$with属性 protected $with = [ 'user:id,display_name', 'limitedLawyers' ];
方式二:通过全局作用域动态添加带条件的预加载
如果不想新增关联方法,可在模型的booted方法里添加全局作用域,自动给查询加上带限制的预加载:
protected static function booted() { static::addGlobalScope('loadLimitedLawyers', function ($query) { $query->with(['lawyer' => function ($q) { $q->limit(4); }]); }); } // 保留$with里的基础预加载 protected $with = ['user:id,display_name'];
注意:如果lawyer是belongsTo一对一关联,limit(4)没有实际意义(一对一只会返回单条记录);仅当关联为一对多/多对多类型时,上述限制逻辑才会生效。
内容的提问来源于stack exchange,提问作者yossi
相关产品推荐
相关产品推荐

