gpt4 book ai didi

php - Laravel 过滤器嵌套关系

转载 作者:行者123 更新时间:2023-12-05 06:13:41 28 4
gpt4 key购买 nike

所以我有三个模型:Volunteer、Task 和 Payment。一个志愿者可以有很多(有很多关系)任务,一个任务可以有很多(另一个有很多关系)付款。

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 或 with。下面是代码:

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();

如有任何帮助,我们将不胜感激!

最佳答案

我想提出一些其他建议,即在 tasks 表中添加一列,指示您的 tasks 迁移中的任务是[付费、未付费或部分付费]像这样

$table->unsignedTinyInteger('paid_status')->default(0); // 0 -> unpaid, 1 -> partially paid, 2 -> paid

然后每次志愿者付款时,您都会进行简单的检查以更新 tasks.paid_status,例如检查总的 paid_amount 和任务 amount

然后像这样在 Volunteer 模型中使用 Laravel hasManyThrough

public function payments()
{
return $this->hasManyThrough(
'App\Payment',
'App\Task'
);
}

现在要获取您的数据,您将这样做

// unpaid tasks
Volunteer::query()->first()->payments()->where('tasks.paid_status', '0')->get();
// partially paid tasks
Volunteer::query()->first()->payments()->where('tasks.paid_status', '1')->get();
// paid tasks
Volunteer::query()->first()->payments()->where('tasks.paid_status', '2')->get();

您可以阅读有关 HasManyThrough Here 的更多信息

关于php - Laravel 过滤器嵌套关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63215455/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com