Laravel 8 如何为Eloquent模型基于关联模型定义active查询作用域
你可以直接使用Laravel Eloquent内置的has()方法实现需求,该方法基于你已经定义好的关联关系做存在性校验,所有过滤逻辑在SQL层面执行,不会拉取冗余数据,也不需要你手动编写关联字段的查询逻辑:
public function scopeActive(\Illuminate\Database\Eloquent\Builder $query) { return $query->has('children'); }
has('children')的底层会自动统计Parent对应的Child关联记录数量,仅返回关联数量≥1的Parent记录,就算1000条Parent中只有1条存在关联子记录,最终也只会拉取这1条有效数据,不会产生资源浪费。
如果你后续需要增加对关联子记录的条件过滤(比如仅统计状态为启用的子记录),可以替换为whereHas()方法:
public function scopeActive(\Illuminate\Database\Eloquent\Builder $query) { return $query->whereHas('children', function (\Illuminate\Database\Eloquent\Builder $childQuery) { // 这里可以增加子记录的过滤条件 $childQuery->where('status', 1); }); }
内容的提问来源于stack exchange,提问作者Matt Komarnicki
相关产品推荐
相关产品推荐

