Я пробовал отличные ранее, но каким-то образом мой запрос не будет выбирать последний комментарий. Он всегда выбирает самый старый комментарий. Затем я попробовал его с groupBy вместо отдельного. Но это тоже не сработает.
Мой текущий запрос:
\App\Comment::limit(5)->groupBy('comments.id')
->orderBy('comments.id', 'desc')
->join('topics', 'comments.topic_id', '=', 'comments.id')
->select('comments.user_id', 'topics.id', 'topics.name')
->whereIn('topics.cat_id', $cats)
->where([['comments.removed', '=', false],['topics.removed', '=', false]])
->get();
Это довольно долго. С кем-то может объяснить, почему это не сработает.
Обнаруженные ошибки
join('topics', 'comments.topic_id', '=', 'comments.id')
соединению join('topics', 'comments.topic_id', '=', 'comments.id')
должно быть связано с столбцами в comments
и topics
таблицыисправлять
\App\Comment::select('comments.user_id', 'topics.id', 'topics.name')
->join('topics', 'comments.topic_id', 'topics.id')
->whereIn('topics.cat_id', $cats)
->where('comments.removed', false)
->where('topics.removed', false)
->latest('comments.id')
->limit(5)
->get();
PS: latest('comments.id')
удобен для orderBy('comments.id', 'desc')
ОБНОВИТЬ
Чтобы получить последние комментарии не более 5 недавно обновленных тем, попробуйте это
\App\Comment::select('comments.user_id', 'topics.id', 'topics.name')
->from(DB::raw("(select * from comments where removed = 0 order by id desc) as comments"))
->join('topics', 'comments.topic_id', 'topics.id')
->whereIn('topics.cat_id', $cats)
->where('topics.removed', false)
->groupBy('topics.id')
->limit(5)
->get();
topics.id
Попробуйте использовать whereHas
. Вы должны сделать что-то вроде этого:
\App\Comment::where('removed', false)
->whereHas('topic', function($q) use ($cats) {
$q->where('removed', false)
->whereIn('cat_id', $cats);
})
->limit(5)
->orderBy('id', 'desc')->get();
Чтобы достичь этого, вы должны иметь отношения, установленные функциями, такими как topics
(т.е. hasMany) в модели Comment
.
whereHas('topic', function($q) {
.