Подсчет очков от всей команды - PullRequest
0 голосов
/ 10 октября 2018

У каждого пользователя есть команда, и у каждой команды есть несколько пользователей.Соответствующий team_id хранится в пользовательской таблице.

Ниже я подсчитываю все точки для Auth :: User и показываю их ему в виде.У меня вопрос, как я могу подсчитать и отобразить очки для каждой команды, чтобы я мог показать пользователям их команды с точками?

И чтобы я мог показать очки соответствующих команд в спискевсе команды.

// --------- Точки пользователя --------- \

    $start = 200;
    $invitations = 50;
    $postp = 10;
    $commentp = 5;

    $postpup = 3;
    $postpdown = -4;
    $commentpup = 2;
    $commentpdown = -3;
    $userpostpup = 2;
    $userpostpdown = 1;
    $usercommentpup = 2;
    $usercommentpdown = 1;

    $invitedpoints = User::where('invited_from_id','=', $user->id)->count()*$invitations;
    $postpoints = $user->posts->count()*$postp;
    $commentpoints = $user->comments->count()*$commentp;

    //---get rating from users on created posts and comments---\\
    $postvotepointsup = Post::where('status', 1)->where('posts.user_id', $user->id)->upVotesAll()->count()*$postpup;
    $postvotepointsdown = Post::where('status', 1)->where('posts.user_id', $user->id)->downVotesAll()->count()*$postpdown;
    $commentvotepointsup = Comment::where('status', 1)->where('comments.user_id', $user->id)->upVotesAll()->count()*$commentpup;
    $commentvotepointsdown = Comment::where('status', 1)->where('comments.user_id', $user->id)->downVotesAll()->count()*$commentpdown;

    //---voted by user---\\
    $userpostvotepointsup = Post_activity::where('user_id','=', $user->id)->where('activity',1)->count()*$userpostpup;
    $userpostvotepointsdown = Post_activity::where('user_id','=', $user->id)->where('activity',0)->count()*$userpostpdown;
    $usercommentvotepointsup = Comment_activity::where('user_id','=', $user->id)->where('activity',1)->count()*$usercommentpup;
    $usercommentvotepointsdown = Comment_activity::where('user_id','=', $user->id)->where('activity',0)->count()*$usercommentpdown;

    $totaluserpoints =$start+$postpoints+$commentpoints+$invitedpoints+$postvotepointsup+$postvotepointsdown+$commentvotepointsup+$commentvotepointsdown+$userpostvotepointsup+$userpostvotepointsdown+$usercommentvotepointsup+$usercommentvotepointsdown;

1 Ответ

0 голосов
/ 10 октября 2018

Я бы сделал что-то вроде этого ... Имейте в виду: это код PSEUDO, просто чтобы показать направление для решения ...

Переместить логику точек в пользовательскую модель

class User extends Model {
    public function points(){
    .. your point logic ..
    }
}

Затем в контроллере, но лучше где-то еще: попросите всех пользователей из группы извлечь коллекцию.

$collection = $team->users()->all();

Затем вы выполните цикл по коллекции, подсчитывая баллы пользователей по всем отдельным пользователям...

$collection->sum(function(User $user){
    return $user->points();
});

Таким образом, вы получите общую сумму для всей команды ...

Если вы сделаете что-то подобное с вами, модель вашей команды:

class Team extends Model {
    public function getTotalUserPoints(){

       $allUsers = $team->users()->all();

       return $allUsers->sum(function(User $user){
             return $user->points();
       });
    }
}

Вы можете получить общую сумму для команды, просто выполнив:

$team->getTotalUserPoints()

А для отдельного пользователя вы можете получить очки, вызвав ту же логику.

$user->points()

И получитьобщее количество команды через отдельного пользователя:

$user->team->getTotalUserpoints()

Опять же, псевдокод, просто чтобы дать людям представление о том, с чего начать.Таким образом, вы получаете всю бизнес-логику о баллах в одном месте (модель пользователя), но вы используете ее для получения как общих, так и индивидуальных баллов.

...