我想在我管理的一个项目中开发一个新功能。这将是左侧和底部面板的类似文章列表。该项目是在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缓存中一小时。谢谢你的回答。
答案 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语句?