Laravel多对多关联模型如何添加条件子句过滤关联数据?
单次查询直接加条件
Auth::user()->reviews()返回的是Eloquent查询构造器实例,直接链式追加where条件过滤reviews表的status字段即可,建议加表前缀避免多表关联时出现字段冲突:
$activeReviews = Auth::user()->reviews()->where('reviews.status', true)->get();
高频使用场景封装关联方法
如果经常需要查询用户的有效评论,可以直接在User模型中新增专属关联方法,减少重复代码:
在User模型中添加如下方法:
/** * 关联当前用户所有已启用的评论 */ public function activeReviews() { return $this->belongsToMany(Review::class, 'review_user') ->where('reviews.status', true) ->withTimestamps(); }
后续调用时直接使用封装好的关联即可:
$activeReviews = Auth::user()->activeReviews()->get();
预加载场景下的条件过滤
如果是在预加载用户数据的场景下需要过滤评论,使用带闭包的预加载即可:
// 预加载当前用户的有效评论 $user = Auth::user()->load(['reviews' => function ($query) { $query->where('status', true); }]); // 直接通过属性获取过滤后的评论集合 $activeReviews = $user->reviews;
内容的提问来源于stack exchange,提问作者bhanu
相关产品推荐
相关产品推荐

