Как получить строки в Eloquent, упорядочив их по наиболее конкретным отношениям? - PullRequest
0 голосов
/ 07 января 2019

У меня есть проект в Laravel 5.1 с тремя таблицами: статьи, теги и сводная таблица для сохранения отношений «многие ко многим»: таблица article_tag.
Мне нужно, чтобы все статьи, связанные по тэгам, относились к конкретной статье, присваивая основной номер или релевантность тем статьям, у которых по числу тэгов было значительное количество совпадений. Итак, первыми будут те, которые «более связаны». Например, если мне требуются все статьи с 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. Как я могу подойти к этому?

1 Ответ

0 голосов
/ 07 января 2019

Предполагая, что вам нужен необработанный 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();

Вам понадобится use DB; в модели / контроллере, где будет использоваться этот код, или вместо этого можно сделать \DB::raw(..).

...