如何通过最具体的关系对 Eloquent 中的行进行排序?

How to get rows in Eloquent ordered by having most specific relationships?

我在 Laravel 5.1 中有一个项目,其中包含三个 table:文章、标签和一个枢轴 table 以保存多对多关系:article_tag table.
我需要通过标签获取所有与特定文章相关的文章,为那些按标签具有大量巧合的文章分配一个主要编号或相关性。因此,第一个是 "more related"。 例如,如果我需要所有带有 tag_id #1 和 #2 的文章,并且如果文章 A 有两个标签但文章 B 只有一个巧合,我希望按顺序排列两篇文章:A,B。

我想我可以用 mysql 语句来做到:

SELECT articles.*, count(*) as tags_count 
FROM article_tag, articles 
WHERE tag_id in (1,2) 
AND articles.id = article_tag.article_id 
GROUP BY article_id 
ORDER BY tags_count DESC

但是我想用Eloquent。我该如何处理它?

假设原始 sql 查询是您需要的,这样的事情应该有效:

$articles = Article::select(DB::raw('articles.*'), DB::raw('count(*) as tags_count'))
    ->join('article_tag', 'article_tag.article_id', '=', 'articles.id')
    ->whereIn('tag_id', [1, 2])
    ->groupBy('article_id')
    ->orderBy('tags_count', 'desc')
    ->get();

您将在 model/controller 中使用此代码,您需要 use DB;,或者您可以改为 \DB::raw(..)