За последние 24 часа нас посетили 34147 программистов и 1314 роботов. Сейчас ищут 927 программистов ...

Алгоритм для звёздночного рейтинга

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 4 окт 2018.

  1. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.815
    Симпатии:
    1.332
    Адрес:
    Лень
    А мне казалось что ты оспой болен
     
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    @MouseZver Жаркие модеры не хотят менять:(
    --- Добавлено ---
    А кстати ведь можно https://xenforo.com/community/threads/change-username.55382/
    Но нужен или плагин или жаркий администратор. Но тот точно без постели ничего не делает.
     
  3. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @nospiou, а я думал "no spi on you"
     
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    @nospiou ип каждый раз меняется
     
  5. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    @Dimon2x Для этого и нужен localStorage плюс пока он сменится человек уже передумает накручивать.
     
  6. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    @nospiou no spam indian ocean user откуда это вообще взял?
     
  7. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
  8. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Серьёзно?
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    А ты почему спрашиваешь?
    --- Добавлено ---
    Я видел твой код на ларавел.ру, он никуда не годится. И, между прочим, ты не учёл возможное деление на ноль. )))
    Есть ощущение, что ты не знаешь что это.
     
  10. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
  11. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Для начала скопируй его сюда, а то как-то странно обсуждать то чего здесь нет.
     
  12. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    @artoodetoo

    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.          $collection =  DB::table('user_rating')
    43.                ->where('master_id', '=', $data->userId)
    44.                ->select(DB::raw('Round(AVG(valuation), 1) as average'))->get();
    45.  
    46.         $avg = $collection->first()->average;
    47.      
    48.          User::where('id', $data->userId) ->update(['rating' => $avg]);
    49.        
    50.     }
     
  13. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Так ты понимаешь что такео "деление на ноль" или нет? Будешь ускользать от ответа, я просто буду тебя игнорировать, Димон. Как уже игнорирует большинство участников форума.
     
  14. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    @artoodetoo нельзя делить на ноль
     
  15. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    На ноль делить можно. Не всегда это тот результат, который нужен.
     
  16. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    @Maputo по логике да, но тогда никому ничего не достанется
     
  17. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Давай буквально построчно:

    Судя по параметру типа Request это методы контроллера. Лучше бы ты оформил операции в модели, ну да ладно...

    Что будет вот здесь $userAuth = Auth::user()->id; , если пользователь не залогинен? Вопрос на миллион!

    $users = DB::table('user_rating') почему ты не используешь класс модели eloquent, ты его не объявлял?
    почему блядь это $users ? это пользователи???????????????

    $userAuth = Auth::user()->id
    ->where('master_id', '=', $request->userId)
    ->where('user_id', '=', $userAuth)

    эммм... что ты хотел этим выразить. два раза используется userId взятый какбы из разных источников. непонятно. это голосование пользователя за пользователя? и за себя можно, да?

    get() получает коллекцию записей. насколько я дружу со здравым смыслом, не может не должно быть более одной записи о голосе пользователя за определенную хуйню. то есть там должен быть уникальный ключ! а как следствие, в коде first() для получения этой единственной записи и проверка на null.

    когда в SQL упоминается AVG и не упоминается GROUP BY, то возвращается одна строка - среднее по всем выбранным значениям.
    у тебя опять зачем-то коллекция и потом извленение первой строки из неё. можно было сразу first()

    дальше мне оценивать в уме лень.

    действительно, раз ты используешь avg на стороне sql, то деление на ноль контролирует сам сервер - это хорошо. в варианте на ларавел.ру у тебя там своё деление было и без проверок. это бага.
    --- Добавлено ---
    ты работаешь где-то? надеюсь нет.

    делить на ноль нельзя, пацаны. никогда.
    --- Добавлено ---
    теоретически - математически, результат деления на ноль это бесконечность. практически же, в мире прикладных языков программирования, это всегда результат недосмотра и приводит к нежданчикам.
     
  18. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    @artoodetoo мидлы я потом проставлю, сейчас хочу, что бы всё в целом работало

    $users потому что копипаст

    Не использую eloquent, потому что не полностью его изучил

    Что бы пользователь не смог сам ставить себе рейтинг, над этим я ещё буду работать
     
  19. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    ну понятно что копипаст. я говорю что надо понимать что ты пишешь, поэтому правильное именование это важно.
    ты используешь классы eloquent, но не везде. ты же пишешь User::where... так что не надо тут лохматить бабушку. ты просто опять скопировал кусочек откуда-то и хочешь чтобы тебе кто-то рассказал чем плох код ещё кого-то. а где твой собственный мозг, Дима?
    хрена ты так научишся чему-то.
     
  20. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    @artoodetoo скопипастил я вот это

    PHP:
    1. $users = DB::table('users')
    2.                      ->select(DB::raw('count(*) as user_count, status'))
    3.                      ->where('status', '<>', 1)
    4.                      ->groupBy('status')
    5.                      ->get();
    Заменил на это

    PHP:
    1.  $users = DB::table('user_rating')
    2.                      ->where('master_id', '=', $request->userId)
    3.                      ->where('user_id', '=', $userAuth)
    4.                      ->get();
     
  21. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Дима, это никому не интересно что там было до тебя.

    Заведи класс типа Rating extends Model и по возможности ссылайся на него. Это повысит описательность твоего кода.
    Используй говорящие имена по теме. Хотя иногда лучше иметь абстрактный $x чем $users который совсем не пользователей хранит. Понимаешь о чём я?
    Если тебе нужна не коллекция, а единственная запись, используй first(). Не get() а от него потом first() а сразу first().
    Всегда оценивай какие в программе должны быть ограничения на уникальность данных. Правильные ключи здорово экономят время.
     
    Dimon2x нравится это.
  22. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    @artoodetoo а ведь [0] и first() это одно и тоже
     
  23. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Нет
    --- Добавлено ---
    Не всё равно занять в долг милллион и вытащить оттуда доллар или занять доллар.
    --- Добавлено ---
    Не надо делать то, в чём нет смысла. Лишний код это грабли на которые ты наступишь завтра.