Запрос Laravel не хочет выбирать последний

0

Я пробовал отличные ранее, но каким-то образом мой запрос не будет выбирать последний комментарий. Он всегда выбирает самый старый комментарий. Затем я попробовал его с 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();

Это довольно долго. С кем-то может объяснить, почему это не сработает.

  • 2
    Чего ты хочешь достичь?
  • 0
    @avonnadozie извините умри ню плохое объяснение Я хочу выбрать 5 тем на основе последних комментариев.
Показать ещё 3 комментария
Теги:
eloquent
laravel-query-builder

2 ответа

1
Лучший ответ

Обнаруженные ошибки

  1. groupBy не требуется
  2. Присоединение 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();
  • 0
    Это решение выглядит чисто, но дает каждый последний комментарий также, если те 2 в 1 теме. это также должно быть отфильтровано по comments.topic_id
  • 0
    Если вы хотите вернуть только один комментарий по теме, то сгруппируйте по topics.id
Показать ещё 7 комментариев
0

Попробуйте использовать 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.

  • 0
    Вызов неопределенного метода Illuminate \ Database \ Query \ Builder :: themes () отношения там есть. Commet имеет отношение к теме, а тема имеет множество комментариев
  • 0
    Если комментарий относится к теме, попробуйте только whereHas('topic', function($q) { .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню