Сделал рейтинг по 5 шкале, всё работает, допустимый ли вариант? Когда пользователь голосует, то данные записываются в отдельную таблицу, потом идёт подсчёт голосов и результат присваивается в поле rating в таблицу user. Код (Text): user_rating id user_id master_id valuation 1 2 2 3 3 3 2 1 14 1 2 4 PHP: public function addRating(Request $request) { $userAuth = Auth::user()->id; //сначала узнаём, голосовал ли уже пользователь //этот пост $users = DB::table('user_rating') ->where('master_id', '=', $request->userId) ->where('user_id', '=', $userAuth) ->get(); //если голосовал, то обновляем его новый голос if($users->count() == 1) { $this->updateRating($users[0]->id, $request); } // иначе первый раз голосуем else { $id = DB::table('user_rating')->insertGetId( [ 'user_id' => $userAuth, 'master_id' => $request->userId, 'valuation' => $request->rating ]); $this->updateRating($id, $request); } } public function updateRating($id, $data) { //обновление рейтинга, для пользователя DB::table('user_rating') ->where('id', $id) ->update(['valuation' => $data->rating]); //найти все голоса, данного поста $collection = DB::table('user_rating') ->where('master_id', '=', $data->userId) ->get(); //количество всего голосов $count= $collection->count(); //извлекаем значения с голосами $plucked = $collection->pluck('valuation'); // подсчёт среднего числа $avg = round($plucked->sum()/$count, 1); User::where('id', $data->userId) ->update(['rating' => $avg]); }
Среднеарифметическое можно посчитать одним запросом SQL. См. https://www.w3schools.com/sql/func_mysql_avg.asp, https://www.w3schools.com/sql/func_mysql_round.asp. Работать с базой из контроллера не хорошо. Надо вынести в отдельный класс, типа RatingManager или что-то в этом роде.
@mkramer вот так сделал PHP: public function updateRating($id, $data) { //обновление рейтинга, для пользователя DB::table('user_rating') ->where('id', $id) ->update(['valuation' => $data->rating]); $collection = DB::table('user_rating') ->where('master_id', '=', $data->userId) ->select(DB::raw('Round(AVG(valuation), 1) as average'))->get(); $avg = $collection->first()->average; User::where('id', $data->userId) ->update(['rating' => $avg]); }