За последние 24 часа нас посетили 22357 программистов и 1022 робота. Сейчас ищут 717 программистов ...

Рейтинг

Тема в разделе "Laravel", создана пользователем Dimon2x, 7 окт 2018.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Сделал рейтинг по 5 шкале, всё работает, допустимый ли вариант?

    Когда пользователь голосует, то данные записываются в отдельную таблицу,
    потом идёт подсчёт голосов и результат присваивается в поле rating в таблицу user.

    Код (Text):
    1. user_rating
    2.  
    3. id    user_id        master_id     valuation
    4. 1    2        2        3
    5.  
    6. 3    3        2        1
    7.  
    8. 14    1        2        4
    PHP:
    1. public function addRating(Request $request)
    2.     {  
    3.         $userAuth = Auth::user()->id;
    4.        
    5.         //сначала узнаём, голосовал ли уже пользователь
    6.         //этот пост
    7.        
    8.          $users = DB::table('user_rating')
    9.                      ->where('master_id', '=', $request->userId)
    10.                      ->where('user_id', '=', $userAuth)
    11.                      ->get();
    12.        
    13.        
    14.          //если голосовал, то обновляем его новый голос
    15.          if($users->count() == 1) {
    16.              $this->updateRating($users[0]->id, $request);
    17.          }
    18.            
    19.          // иначе первый раз голосуем
    20.          else {
    21.               $id = DB::table('user_rating')->insertGetId(
    22.                 [
    23.                     'user_id' => $userAuth,
    24.                     'master_id' => $request->userId,
    25.                     'valuation' =>  $request->rating
    26.                 ]);
    27.              
    28.                $this->updateRating($id, $request);
    29.              
    30.          }  
    31.     }
    32.    
    33.     public function updateRating($id, $data)
    34.     {
    35.      
    36.         //обновление рейтинга, для пользователя
    37.           DB::table('user_rating')
    38.             ->where('id', $id)
    39.             ->update(['valuation' => $data->rating]);
    40.            
    41.            
    42.          
    43.          //найти все голоса, данного поста
    44.          $collection =  DB::table('user_rating')
    45.                ->where('master_id', '=', $data->userId)
    46.                ->get();
    47.        
    48.          //количество всего голосов
    49.          $count= $collection->count();
    50.        
    51.          //извлекаем значения с голосами
    52.          $plucked = $collection->pluck('valuation');
    53.            
    54.        // подсчёт среднего числа
    55.          $avg = round($plucked->sum()/$count, 1);
    56.            
    57.          User::where('id', $data->userId) ->update(['rating' => $avg]);
    58.        
    59.     }
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
  3. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @mkramer вот так сделал

    PHP:
    1. public function updateRating($id, $data)
    2.     {
    3.      
    4.         //обновление рейтинга, для пользователя
    5.           DB::table('user_rating')
    6.             ->where('id', $id)
    7.             ->update(['valuation' => $data->rating]);
    8.  
    9.      
    10.          $collection =  DB::table('user_rating')
    11.                ->where('master_id', '=', $data->userId)
    12.                ->select(DB::raw('Round(AVG(valuation), 1) as average'))->get();
    13.  
    14.         $avg = $collection->first()->average;
    15.      
    16.          User::where('id', $data->userId) ->update(['rating' => $avg]);
    17.        
    18.     }