如何根据通用标签对相关文章进行排序?

阿哈德·阿巴斯·拉德

我有一个文章和标签表。每篇文章可以有多个标签。我想获取一篇文章的相关文章,并根据常见标签对结果进行排序。

// Tag Model
class Tag extends Model
{
    public function posts()
    {
        return $this->morphedByMany(Article::class, 'taggable');
    }
}
// Article Model
class Article extends Model
{
    public function tags()
    {
        return $this->morphToMany(Tag::class, 'taggable');
    }
}

我使用此代码获取相关文章,但我不知道如何基于更常见的标签对结果进行排序。

// And i 
$relatedArticle = Article::whereHas('tags', function($query) use ($article){
    $query->whereIn('name', $article->tags->pluck('name'));
})->where('id', '!=', $article->id)->take(10)->get();

奥古斯托·莫拉(Augusto Moura)

在SQL中,所需的信息将通过类似这样的方式检索(我不知道关联表的名称或外键和主键,因此如有必要,请进行更改):

SELECT articles.*, 
(
    SELECT COUNT(tags.id)
    FROM tags 
    JOIN articles_tags at ON tags.id = at.tag_id
    WHERE tags.name in ('A', 'B', 'C') /* acquired from $article->tags->pluck('name') */
    AND at.article_id = a.id
) as tags_in_common
FROM articles a 
WHERE articles.id != {$id} 
AND tags_in_common >= 1
ORDER BY tags_in_common DESC
LIMIT 10;

现在,使用queryBuilder,我们不得不变得有点脏,但看起来可能像这样:

//Fetches pairs: [article_id, numberInCommon]
$tagsInCommon = DB::table('tags')
    join('articles_tags', 'tags.id', '=', 'articles_tags.tag_id')
    ->select('articles_tags.article_id', DB::raw('COUNT(*) as numberInCommon'))
    ->whereIn('tags.name', $article->tags->pluck('name'))
    ->groupBy('articles_tags.article_id')

$relatedArticle = Article::
    ->joinSub($tagsInCommon, 'tags_in_common', function($join){
        $join->on('id', '=', 'tags_in_common.article_id')
    })
    ->where('id', '!=', $article->id)
    ->orderBy('tags_in_common.numberInCommon', 'desc')
    ->take(10)
    ->get();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Octobercms中对列表顶部的精选博客文章进行排序

我将如何添加标签以在MVC应用程序中对博客文章进行分区?

按大多数评论对文章进行排序

按模板变量对文章进行排序

如何在Slim 2中对博客文章进行分页?

什么将是 Laravel 查询以对文章进行最大排序

如何根据标签文本对标签的数组列表进行排序?JavaFX

dbpedia-仅对英文文章进行索引吗?

我想对我的文章进行OOP分页

标签名称相关文章

Pandas 函数根据标签进行排序

如何根据其他标签数组对带有标签的对象数组进行排序?

Django如何根据相关模型对查询集进行过滤和排序

如何根据字典的值对目标单词进行排序并计算相关单词?

如何根据具有不同相关权重的两个字段对记录进行排序?

如何根据其中一个列表中的值对4个相关列表进行排序?

如何找到相关文章

如何根据“。”对arraylist进行排序?

PHP:根据与键值相关的术语对多维数组进行排序

如何对通用(void *)数组进行排序?

如何在忽略文章(A,An,the)的同时对javascript数组进行排序?

如何使用PHP对数组进行排序,而忽略开头的文章(a,an,the)?

如何根据熊猫的df列的位置而不是标签来对它们的值进行排序?

如何根据 XML 的每个标签中存在的特定属性对多级 XML 进行排序?

通用按相关对象排序

如何加载相关博客文章?

如何基于带有两个表的标签查询相关文章?

即使具有相同标签,如何从相关文章中排除当前帖子?

如何获取与模型中任何博客文章相关的标签列表 - Django