Итак, у меня есть три модели: Волонтер, Задача и Оплата. У волонтера может быть много (много взаимосвязанных) задач, а у задачи может быть много (у другого много взаимосвязей) выплат.
class Volunteer
public function tasks()
{
return $this->hasMany(Task::class);
}
class Task
public function volunteer()
{
return $this->belongsTo(Volunteer::class);
}
public function payments()
{
return $this->hasMany(Payment::class);
}
class Payment
public function task() {
return $this->belongsTo(Task::class);
}
Теперь я хочу опросить всех добровольцев с неоплачиваемыми / частично оплачиваемыми задачами. Итак, в основном я хочу отфильтровать задачи волонтера, где сумма каждой задачи должна равняться сумме всех платежей, связанных с этой конкретной задачей.
Я пробовал использовать whereHas и with, но, похоже, не могу фильтровать задачи правильно.
Мне удалось сделать это с помощью соединений, но мне было интересно, возможно ли это с помощью whereHas или с. Ниже приведен код:
Volunteer::select('volunteers.id', 'volunteers.name', 'tasks.amount', DB::raw('SUM(payments.amount) as amount_paid'))
->join('tasks', 'tasks.volunteer_id', '=', 'volunteers.id')
->leftJoin('payments', 'payments.task_id', '=', 'tasks.id')
->groupBy('volunteers.id', 'volunteers.name', 'tasks.amount')
->havingRaw('amount_paid >= tasks.amount')
->get();
Любая помощь приветствуется!