在Laravel 10中用morphToMany查找重复项,需使用哪个Laravel对象?
在Laravel 10中使用morphToMany查找重复项的实现方案
核心对象
你需要基于 Illuminate\Database\Eloquent\Model 来实现——morphToMany 本身就是Laravel Eloquent模型提供的多态多对多关联方法,所有继承该基类的自定义业务模型都能调用这个方法构建关联关系,进而完成重复项查询。
具体实现步骤
定义多态多对多关联
假设你有Tag模型,需要与Post、Video等模型建立多态关联,先在模型中定义关联方法:// Tag模型 class Tag extends Model { public function taggables() { // 关联多态模型,第二个参数是多态关联的前缀 return $this->morphToMany(Taggable::class, 'taggable'); } }或者在业务模型中反向定义关联:
// Post模型 class Post extends Model { public function tags() { return $this->morphToMany(Tag::class, 'taggable'); } }通过关联查询重复项
- 场景1:查找被多个模型重复关联的标签
$duplicateTags = Tag::select('tags.*', DB::raw('count(taggable_id) as 关联次数')) ->join('taggables', 'tags.id', '=', 'taggables.tag_id') ->groupBy('tags.id') ->having('关联次数', '>', 1) ->get(); - 场景2:查找某类模型下存在重复标签的记录
$postsWithDuplicateTags = Post::whereHas('tags', function ($query) { $query->select('tag_id') ->groupBy('tag_id') ->havingRaw('count(*) > 1'); })->get();
- 场景1:查找被多个模型重复关联的标签
直接查询多态关联表的重复记录
如果需要排查多态关联中间表(比如taggables)的重复数据,可以直接使用查询构建器(Illuminate\Database\Query\Builder)操作:$duplicateRelations = DB::table('taggables') ->select('taggable_type', 'taggable_id', 'tag_id', DB::raw('count(*) as 重复次数')) ->groupBy('taggable_type', 'taggable_id', 'tag_id') ->having('重复次数', '>', 1) ->get();
内容的提问来源于stack exchange,提问作者Viviane Le Hegaret
相关产品推荐
相关产品推荐

