创建列访问器的总和(Laravel

时间:2018-03-05 16:33:10

标签: laravel eloquent accessor

我提高了我在laravel的技能,使网络成为一个简单的挑战,但我坚持下一个问题。

我有带有id,姓名,邮件等的用户表。挑战表我列出了所有挑战(列id,姓名,正文,答案,得分)和第三个表名为"答案& #34;我发布用户使用列id,user_id,challenge_id,success(boolean)和得分来解决挑战的每次尝试。

现在我正试图用他们的分数对用户进行排名。问题是要显示列'得分的总和()。在表中的答案user_id.answers = users.id。所以我可以轻松获得每个用户的总分。

现在我解决了在刀片中执行此操作的问题:

@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但想要从雄辩的查询中获得desc命令)并且在刀片中有这样的东西:

@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答案。但我不确定如何将结果传递给刀片。尝试修补:

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

总是得到id = 1的总和。并且用$ user-&gt;得分;在叶片foreach中我得到了一个&#39; 0&#39;

2 个答案:

答案 0 :(得分:0)

我认为这是你正在寻找的东西。需要一段时间才能习惯Eloquent ORM :-)

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

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

答案 1 :(得分:0)

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

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

$users = User::get();

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