对列访问器进行 sum() Laravel

Make a sum() of column accessors Laravel

我正在提高我在 laravel 制作简单挑战网页方面的技能,但我遇到了下一个问题。

我有用户 table 的 ID、姓名、邮件等。挑战 table 我列出了所有挑战(列有 ID、姓名、正文、答案、分数)第三个 table 称为 "Answers",其中我 post 用户每次尝试使用列 id、user_id、challenge_id、成功(布尔值)解决挑战和得分。

现在我正在尝试根据分数对用户进行排名。问题是在 table 答案中显示列 'score' 的 sum(),其中 user_id.answers = users.id。这样我就可以轻松得到每个用户的总分。

现在我解决了 blade 中的问题:

@foreach($users as $user)
<tr>
<th>{{ $user->id }}</th>
<td>{{ $user->name }}</td>
<td>Team pindonga</td>
<td>{{ score = DB::table('answers')->where('user_id', $user->id)->sum('score') }} </td> </tr>
@endforeach

完美地工作,但我想通过 desc 分数获得它们(现在我用 js 解决了 desc 但想从 eloquent 查询中获得 desc 顺序)并且在 blade:

@foreach($users as $user)
<tr>
<th>{{ $user->id }}</th>
<td>{{ $user->name }}</td>
<td>Team pindonga</td>
<td>{{ $team->score }} </td> </tr>
@endforeach

我正在考虑通过访问器做这样的事情来解决它:

public function getScoreAttribute($value)
{
    return $this->groupBy('user_id')->where('user_id', '=', $value)->sum('score');
}

我在用户的答案模型中也有 belongsTo 关系,在用户答案中有 hasMany 关系。但我不确定如何将结果传递给 blade。在 tinker 中尝试过:

    >>> \App\Answer::find(1)->score;
=> "3400"
>>> \App\Answer::find(2)->score;
=> "3400"
>>> \App\Answer::find(5)->score;
=> "3400"

总是得到 id = 1 的总和。并且 $user->score;在 blade foreach 中,我得到了一个“0”。

我想这就是您要找的。习惯 Eloquent ORM 需要一段时间:-)

foreach($users as $user){
  print $user->answers->sum('score');
}

https://laravel.com/docs/5.6/queries#aggregates

使用与 Blade 的关系将是 {{ $user->answers->sum('score') }}。不需要访问器。

对于排序,我会使用 sortByDesc 收集方法。

$users = User::get();

$users = $users->sortByDesc(function ($user) {
  return $user->answers->sum('score');
});