You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel多对多关联下获取关联模型去重值的实现方法

Laravel多对多关联下获取有效关联标签的实现

场景说明

现有两个Eloquent模型:Article(文章) 和 Tag(标签),二者为多对多关联关系:

  • Article模型关联定义:
class Article extends Model
{
    public function tags()
    {
        return $this->belongsToMany(Tag::class);
    }
}
  • Tag模型关联定义:
class Tag extends Model
{
    public function articles()
    {
        return $this->belongsToMany(Article::class);
    }
}

需要实现的需求:在Article模型中编写静态方法allTags(),返回所有至少关联了1篇文章的唯一标签。

实现代码

直接使用Eloquent提供的whereHas关联查询方法即可实现需求,该方法会自动校验关联存在性,过滤掉无关联文章的标签,无需手动编写中间表连接、去重逻辑,还可以根据业务需要追加文章的过滤条件,比如排除草稿状态的文章:

public static function allTags()
{
    return Tag::query()
        ->whereHas('articles', function($query) {
            // 业务过滤条件,不需要可删除闭包内内容
            $query->where('status', '<>', 'draft');
        })
        ->pluck('tag', 'id');
}

逻辑说明:whereHas('articles')底层会自动生成多对多中间表的存在性查询,默认要求关联记录数≥1,天然满足「至少关联1篇文章」的筛选要求,返回结果自动为不重复的标签集合,通过pluck方法可以按需返回标签名和对应ID的键值对结果。

内容的提问来源于stack exchange,提问作者Bappy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:03:19