类似的文章基于标签重量

时间:2014-06-01 13:40:06

标签: php mysql sql laravel tags

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

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

我们希望根据这一原则为类似文章挑选更精确的文章:

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

这里有多对多的关系,在Article和Tag表之间(带有数据透视表)。

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

例如,当我们有一个标签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方式完成,有一些原始的sql,还是完全原始的sql?

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

1 个答案:

答案 0 :(得分:0)

您是否尝试过查询构建器?在使用复杂的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语句?