Как получить сумму столбца связанных моделей в Eloquent - PullRequest
0 голосов
/ 25 июня 2018

У меня есть отношение hasMany к моей модели пользователя

public function timesheet()
    {
        return $this->hasMany('App\TimeTable', 'employee');
    }

и я хотел бы получить сумму столбца

$users = User::select('firstname','lastname')->with('timesheet')->get();

foreach($users as $user) {
    //sume of $user->timesheet
    //tried $user->timesheet->sum('minutes') which return on each iteration 0
}

Каков наилучший подход для получения правильного результата?

проблема заключается в том, что я использую select fileds для объекта User. С другой стороны, сумма действительно дорогая, и я получаю Allowed memory size of 1073741824 bytes exhausted

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Для активной загрузки вы должны выбрать столбец users.id:

$users = User::select('id', 'firstname', 'lastname')->with('timesheet')->get();

Если вы выбираете только модели timesheet за минуты, вы можете использовать модифицированный withCount():

User::withCount(['timesheet as minutes' => function($query) {
    $query->select(DB::raw('sum(minutes)'));
}])->get();

foreach($users as $user) {
    $user->minutes
}
0 голосов
/ 25 июня 2018

Попробуйте что-то в этом духе:

$users_with_time = $users->keyBy('id')->map(function($user) {
    return $user->sum('timesheets.minutes');
});

Он принимает вашу коллекцию пользователей, вводит их ключами пользователя id и сопоставляет результирующую коллекцию с суммой свойства minutestimesheets Eloquent Collection.

У вас должна быть коллекция поддержки общего времени, потраченного на одного пользователя.

У меня не было времени проверить это, но это должно быть хорошим местомначать с.

...