请教一下多态关联的这种查询怎么查?

表结构如下

//帖子表
posts
    id - integer
    name - string

//用户表
users
    id - integer
    name - string

//标签表
tags
    id - integer
    name - string

//标签关联表
taggables
    tag_id - integer
    taggable_id - integer
    taggable_type - string

现在有三张表,用户表(users),帖子表(users),标签表(tags),用户和帖子都是多态关联了标签表。

//UserModel
public function tags()
{
  return $this->morphToMany(TagModel::class, 'taggable', 'taggables')->withTimestamps();
}

//PostModel
public function tags()
{
  return $this->morphToMany(TagModel::class, 'taggable', 'taggables')->withTimestamps();
}

需求是:查询出帖子的标签,和用户的标签,有重合的帖子,且标签重合数量越多排序在越前面。
各位有什么思路吗?

心之所向,素履以往。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

可以试试使用withCount()

PostModel::withCount([
    'tags as repeat_tags' => function ($query) use ($tags) {
        return $query->whereIn('id', $tags);
     }
])->latest('repeat_tags')->get();
1年前 评论
讨论数量: 4
//用户标签id
$tags = $user->tags()->get()->pluck('id')->toArray();

 PostModel::query()
    ->whereHas('tags', function (Builder $query) use($tags){
        return $query->whereIn('id', $tags);
     })->get();

目前能查出有标签重合的帖子,但是排序这个没有思路

1年前 评论

标签重合 这个应该只能使用子查询进行排序把.

1年前 评论
lmdfx (楼主) 1年前

可以试试使用withCount()

PostModel::withCount([
    'tags as repeat_tags' => function ($query) use ($tags) {
        return $query->whereIn('id', $tags);
     }
])->latest('repeat_tags')->get();
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!