Сортировать по среднему значению в отношении Один ко Многим - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть следующие 3 отношения:

Пользователь:

public function posts () {
    return $this->hasMany(Post::class)->orderBy('created_at', 'DESC');
}

public function ratings () {
    return $this->hasMany(Rating::class)->orderBy('created_at', 'DESC');
}

Сообщение:

public function user () {
    return $this->belongsTo(User::class);
}

public function ratings () {
    return $this->hasMany(Rating::class)->orderBy('created_at', 'DESC');
}

Рейтинг:

public function user () {
    return $this->belongsTo(User::class);
}

public function post () {
    return $this->belongsTo(Post::class);
}

AПользователь может создавать сообщения, а другие пользователи могут оценивать сообщения в основном.

В моем контроллере я хочу иметь возможность сортировать сообщения по 3 фильтрам, дате создания, дате обновления и сообщениям с самым высоким рейтингом в среднемрейтинг .

Первые две опции фильтра я решил со следующим кодом:

return Post::with(['user'])->orderBy('created_at', 'DESC')->paginate(15)->onEachSide(1);

и

return Post::with(['user'])->orderBy('updated_at', 'DESC')->paginate(15)->onEachSide(1);

Однако я не знаю, каксортировать посты по средним рейтингам.Может ли кто-нибудь указать мне правильное направление?

Кроме того, можно ли запретить постам с одним рейтингом быть в верхней части списка, возможно, потребуется, чтобы сообщение имело как минимум X оценок, прежде чем оно будет подсчитано

1 Ответ

0 голосов
/ 29 сентября 2019

Удалите отношение ratings в модели User, так как пользователи не могут получать оценку

. Затем передайте закрытие методу withCount, чтобы упорядочить по рейтингу, используя функцию SQL coalesce через необработанный оператор SQL.на фасаде БД

return Post::with(['user'])->withCount(['ratings as average' => function ($query) {
            $query->select(\DB::raw('coalesce(avg(column_in_ratings_table), 0)'));
}])->orderByDesc('average')->get();

можно ли запретить попадание постов с одним рейтингом в верхнюю часть списка?

Да, используя области запросов

Однако учтите, что вы не можете задать несколько вопросов для одного сообщения в переполнении стека. См. этот мета

Ваш вопрос может быть помеченкак too broad

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...