@coderron look here https://laravel.com/docs/8.x/queries#advanced-join-clauses
->join("expense_reports", function ($query) {
$query->on("expense_reports.id", "=", "expenses.expense_report_id")
->whereNotNull('expense_reports.deleted_at')
->whereNotNull('expense_reports.rejected_at')
->whereNotNull('expense_reports.cancelled_at');
})
and subquery joins https://laravel.com/docs/8.x/queries#subquery-joins for the second
$expenseReportPayment = DB::table('expense_report_payment')
->select(`expense_report_payment.*`)
->join("payments", "payments.id", "=", "expense_report_payment.payment_id")
->whereNotNull('payments.deleted_at')
->whereNotNull('payments.rejected_at')
->whereNotNull('payments.cancelled_at');
and then connect it to your query
->joinSub($expenseReportPayment , 'erp', function ($join) {
$join->on('erp.expense_report_id', '=', 'expense_reports.id');
})