Сделать сумму () столбцов доступа Laravel

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

У меня есть таблица пользователей с идентификатором, именем, почтой и т. Д. Таблица задач, в которой я перечисляю все задачи (с идентификаторами столбцов, именем, телом, ответом, оценкой) и третья таблица под названием "Ответы", где я публикую каждую попытку пользователей, решающих задачу с помощью столбцов id, user_id, challenge_id, success (boolean) и Score.

Сейчас я пытаюсь составить рейтинг пользователей с их оценками. Проблема состоит в том, чтобы показать сумму () столбца "оценка" в таблице ответов, где 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 (сейчас я решил desc с помощью js, но хочу получить порядок 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');
}

Также у меня есть отношение, принадлежащее к моделям ответов для пользователей и hasMany в пользователях к ответам. Но я не уверен, как передать результаты лезвию. Попробовал в повозке:

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

всегда получая сумму id = 1. И с $user->score; в каждом клинке я получил "0".

2 ответа

Решение

Использование отношений с Блейдом было бы {{ $user->answers->sum('score') }}, Аксессуар не нужен.

Для сортировки я бы использовал метод коллекции sortByDesc.

$users = User::get();

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

Я думаю, это то, что вы ищете. Требуется время, чтобы привыкнуть к Eloquent ORM:-)

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

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

Другие вопросы по тегам