我有一个复杂的设置,其中包括以下表格。
Customers
Transactions
Jobs
Rounds
Job_Rounds
我想输出所有过期的客户。我通过使用以下查询完成了此操作:
$data = Auth::user()->clients()->leftjoin('transactions','clients.id','=','transactions.client_id')
->select(DB::raw('sum(gross) as value, email, first_name, last_name, mobile, clients.id, addressline1'))
->groupBy('id','first_name','last_name','email','mobile','addressline1', 'clients.id')
->havingRaw('SUM(gross) < 0')
->get();
这将返回所有过期的客户,这很棒,但是我现在希望能够全面过滤过期的客户。
我的关系如下:
Customers > Jobs.client_id
Customers > Transactions.client_id
Jobs > Rounds via Jobs_Rounds
我将给定回合的round_id传递给我的控制器,然后尝试根据round_id过滤结果。我存储回合ID的唯一位置是在jobs_rounds表中,该表仅包含job_id和round_id。
最佳答案
我正在考虑使用HasManyThrough关系来链接Customer
和Round
。
像这样的东西:
// Customer.php
public function rounds()
{
return $this->hasManyThrough(Round::class, Job::class, 'client_id', 'job_id', 'id');
}
然后,您可以在控制器中尝试以下操作:
$data = Auth::user()->clients()
->whereHas('rounds', function ($query) {
$query->where('id', request()->input('round_id'))
})
//... the rest of your filters