Поле Сумма предметов в коллекции коллекций - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь выяснить, возможно ли это, но я хотел бы получить сумму поля в элементе в коллекции коллекций.

В моем контроллере есть следующее:

    $prefiltered_contacts = Contact::with(['donations' => function ($query) use ($request) {
            $query->whereMonth('date_received', $request->month)
                ->whereYear('date_received', $request->year);
    }])->get();

    $contacts = $prefiltered_contacts ->filter(function ($contact) {
        return $contact->donations->isNotEmpty();
    });

У моего класса пожертвований есть следующее:

public function monetary_donations(){
    return $this->hasMany('App\Payments_Distribution', 'donation_id','id');
}

Теперь последняя часть этого заключается в том, что в классе Payments_Distribution есть поле с названием amount.

Если бы я исходил из модели пожертвований, я бы получил сумму денежных пожертвований как $donation->monetary_donations->sum('amount'); и получил бы эту сумму. Но как мне поступить с моделью Contact? Или это даже возможно, если учесть, что для сбора денежных пожертвований потребуется пройти через сбор пожертвований? Я пытаюсь получить отчет обо всех пожертвованиях контактов (и денежных пожертвований) и вывести промежуточные итоги денежных пожертвований за этот конкретный период.

1 Ответ

0 голосов
/ 08 января 2019

Sum принимает закрытие в качестве аргумента. Так что вы можете сделать что-то вроде этого:

$sum = $donations->sum(function ($donation) {
    return $donation->monetary_donations->sum('amount');
});

или на 1 уровень выше (от $contacts):

$sum = $contacts->sum(function ($contact) {
    return $contact->donations->sum(function ($donation) {
        return $donation->monetary_donations->sum('amount');
    });
});

Edit:

Я бы также рекомендовал загружать ваши отношения и отфильтровывать контакты без пожертвований с помощью SQL, а не коллекций:

$contacts = Contact::with(['donations' => function ($query) use ($request) {
        $query
            ->with('monetary_donations')
            ->whereMonth('date_received', $request->month)
            ->whereYear('date_received', $request->year);
}])
    ->whereHas('donations') // Filter out those without donations with SQL
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...