Как лучше написать этот запрос в Laravel Eloquent? - PullRequest
0 голосов
/ 05 октября 2019

Я использую этот запрос для подсчета кликов, конверсий, выплат и дохода от предложения. Теперь проблема в том, что запрос занимает около 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 миллионов кликов. Тогда на создание этого отчета уйдет много времени.

Как лучше написать этот запрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...