我有一个复杂的设置,其中包括以下表格。

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关系来链接CustomerRound

像这样的东西:

// 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

10-05 19:41