Мне нужно использовать построитель запросов laravel для запроса с подзапросом с несколькими динамическими c фильтрами.
Код выглядит примерно так:
$totalRechargesPerUserQuery = DB::table('transactions as T2')
->select([DB::raw('COUNT(T2.user_id)')])
->join('users as U2', 'U2.id', '=', 'T2.user_id')
->whereRaw('U2.id = U1.id')
->groupBy('T2.user_id');
$this->applyPromotionFilter($totalRechargesPerUserQuery, $selectedWeeks, 'T2');
$query = DB::table('transactions as T1')
->select([
'U1.name',
'U1.email',
'U1.role',
'T1.amount',
DB::raw('COUNT(T1.user_id) as count'),
DB::raw("({$totalRechargesPerUserQuery->toSql()}) as total")
])
->join('users as U1', 'U1.id', '=', 'T1.user_id');
$this->applyPromotionFilter($query, $selectedWeeks, 'T1');
$query->addBinding($totalRechargesPerUserQuery->getBindings());
Фильтр function:
private function applyPromotionFilter(\Illuminate\Database\Query\Builder $query, array $selectedWeeks, $tableAlias = 'transactions'): void
{
$query->where(function ($query) use ($selectedWeeks, $tableAlias) {
foreach ($selectedWeeks as $selectedWeek) {
$query->orWhere(function ($query) use ($selectedWeek, $tableAlias) {
$query->whereBetween("$tableAlias.created_at", [$selectedWeek['start'], $selectedWeek['end']]);
});
}
});
}
До этого момента я заставлял его работать, меняя свое положение whereRaw следующим образом:
$query->whereRaw("T1.type = '" . Transaction::TYPE_RECHARGE . "'")
Но мне нужно применить фильтры, выбранные пользователем, как в функция applyPromotionFilter и когда я использую где или где и т. д. c. запрос, генерируемый при выполнении $ query-> get (), содержит параметры не на своем месте.
Например:
and ((`T1`.`created_at` between 'CLIENTE' and '2019-12-30 00:00:00') or (`T1`.`created_at` between '2020-01-05 23:59:59' and '2020-01-06 00:00:00')) and `U1`.`role` = '2020-01-12 23:59:59'
. В этом сгенерированном фрагменте запроса значение даты изменяется ролью пользователя.
Было бы очень полезно сделать это с помощью построителя запросов, а не необработанных SQL из-за динамических c фильтров. что я должен подать заявление.
Любая помощь будет оценена! Заранее спасибо.