Я использую этот запрос для подсчета кликов, конверсий, выплат и дохода от предложения. Теперь проблема в том, что запрос занимает около 1 минуты для 26 предложений и около 15 000 кликов.
Вот мой запрос
$offers=Offers::select('offer_id','offer_name','offer_currency')
->with(['currency' => function ($query) {
$query->select('currency_id', 'currency_symbol');
}])
->when($request->filter_offer, function($query) use ($request){
return $query->where('offer_id', $request->filter_offer);
})
->whereHas('clicks', function($q) use ($date_from,$date_to){
$q->whereBetween('created_at', [$date_from, $date_to]);
})
->withCount(['conversions'=> function($q) use ($date_from,$date_to){
$q->whereBetween('conversion_date_time', [$date_from, $date_to]);
}])
->withCount(['clicks'=> function($q) use ($date_from,$date_to){
$q->whereBetween('created_at', [$date_from, $date_to]);
}])
->withCount(['conversions AS payout' => function ($query) use ($date_from,$date_to) {
$query->select(DB::raw("SUM(conversion_payout) as payout"))
->whereBetween('conversion_date_time', [$date_from, $date_to]);
}])
->withCount(['conversions AS revenue' => function ($query) use ($date_from,$date_to) {
$query->select(DB::raw("SUM(conversion_revenue) as revenue"))
->whereBetween('conversion_date_time', [$date_from, $date_to]);
}])
;
return Datatables::of($offers)->make(true);
Теперь этот отчет является динамическим, пользователь может сгенерироватьотчет на основании дат и предложения. Это приложение будет иметь более 100 предложений и более 100 миллионов кликов. Тогда на создание этого отчета уйдет много времени.
Как лучше написать этот запрос?