Есть 2 варианта для красноречивого выполнения.
Вариант 1
Первый способ - добавить score_sum
в качестве атрибута, который всегда включается при запросе модели users
. Это только хорошая идея, если вы будете использовать score_sum
большую часть времени при запросе таблицы users
. Если вам нужен только score_sum
для очень специфического представления или для конкретной бизнес-логики, тогда я бы использовал второй вариант ниже.
Для этого вы добавите атрибут к модели users
, вы можете посмотреть здесь документацию: https://laravel.com/docs/5.6/eloquent-mutators#defining-an-accessor
Вот пример вашего варианта использования:
/ приложение / User.php
class User extends Model
{
.
.
.
public function getScoreSumAttribute($value)
{
return $this->scores()->sum('score');
}
}
Вариант 2
Если вы просто хотите сделать это для одного варианта использования, то самое простое решение - просто использовать функцию sum()
в возможном цикле foreach
, который вы будете использовать (скорее всего, в представлении).
Например, в виде:
@foreach($users as $user)
<div>Username: {{$user->username}}</div>
<div>Sex: {{$user->sex}}</div>
<div>Score Sum: {{$user->scores()->sum('price')}}</div>
@endforeach
Кроме того, если вы не хотите делать это в цикле foreach
, вы можете использовать необработанный запрос при вызове Eloquent в вашем контроллере, который получает `score_sum '. Вот пример того, как это можно сделать:
$users = User::select('score_sum',DB::raw(SUM(score) FROM 'scores'))->get();
У меня не было быстрой среды для проверки этого, вам может понадобиться предложение WHERE в запросе DB::raw
Надеюсь, это поможет!