【问题标题】:Similar articles based on tag weight基于标签权重的相似文章
【发布时间】:2014-06-01 13:40:05
【问题描述】:

我想在我管理的一个项目中开发一项新功能。这将是左侧和底部面板的类似文章列表。该项目是在 Laravel 中开发的。

当用户查看一篇文章时,底部和左侧面板中会显示一些相似的文章,当前按查看次数排序,它们与当前查看的文章来自同一类别。

我们希望根据这个原则对类似文章进行更精确的文章挑选:

编辑者可以在管理中创建一个标签,并为标签分配一个数值(权重)。可以为一篇文章分配多个标签。

这里有多对多关系,在文章和标签表之间(带有数据透视表)。

当用户查看特定文章时,我想编写一个查询以根据标签关联及其权重来选择相似的文章。

例如,当我们有一个标签 Home,重量为 20,Furniture 为 15,Kids 为 10 等。查询获取当前文章的标签并开始将它们与其他文章标签进行比较,并根据总和对它们进行排序标签权重。

例子:

Article A : Home 20, Furniture 15, Garden 10
Article B : Garden 10, Home 20, Kids 5
Article C : Garden 10, Kids 5
Article D : Furniture 15, Kids 5

我们正在查看文章 B,我们与其他文章具有相同的标签关联:

Article A: Home 20 -> Weight score: 20
Article C: Garden 10, Kids 5 -> Weight score: 15
Article D: Kids 5 -> Weight score: 5

然后这些文章按分数降序排列,并按此顺序显示在左栏中。

由于到目前为止我只使用 Eloquent,所以我无法将我的头脑围绕可以执行此操作的原始 sql 查询。或任何其他 Eloquent 方式。

有人知道这是否可以通过 Eloquent 方式完成,使用一点原始 sql,还是完全原始 sql?

我知道这个查询很复杂,所以我会将它存储在 Redis 缓存中一个小时。谢谢你的回答。

【问题讨论】:

    标签: php mysql sql laravel tags


    【解决方案1】:

    您是否尝试过查询生成器?我认为在处理复杂的 SQL 查询时,无论如何这是最简单的解决方案。

    这是一个例子(我自己没有尝试过,只是假设 orderBy 会起作用):

    DB::table('articles')->
        select(
            'articles.name as a_name',
            'tags.name as t_name',
            'article_tag.weight as p_weight'
        )->join(
            'article_tag'
            function($join)
            {
                $join->on(
                    'articles.id',
                    '=',
                    'article_tag.articles_id'
                )->orderBy(
                    'article_tag.weight'
                );
            }
        )->join(
            'tags'
            function($join)
            {
                $join->on(
                    'tags.id',
                    '=',
                    'article_tag.tags_id'
                );
            }
        )->groupBy(articles.name)->get();
    

    这应该将数据作为数组返回

    雄辩: 您是否尝试过 Model::with 语句?

    【讨论】:

    • 感谢您的回答,我会尽快尝试并返回结果。
    猜你喜欢
    • 2016-09-14
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多