Laravel Eloquent Eager Load Sums - PullRequest
0 голосов
/ 18 мая 2018

Я использую готовую загрузку для загрузки данных перед загрузкой страницы, чтобы ускорить загрузку.

$websites = Website::with('valid_click_ads',
                          'facebook_ads',
                          'google_ads')->get();

Мне было интересно, есть ли способ получить суммирование столбцов таким способом.Пример:

$websites = Website::with('valid_click_ads:sum(clicks),sum(revenue)',
                          'facebook_ads:sum(clicks),sum(impressions)',
                          'google_ads:sum(clicks),sum(impressions)')->get();

Это увеличит время загрузки!Спасибо!

1 Ответ

0 голосов
/ 18 мая 2018

Ничего подобного нет, но вы можете использовать метод withCount в качестве обертки для суммы следующим образом:

$websites = Website::withCount(['valid_click_ads'=>function($query){
                         $query->select( DB::raw( "COALESCE(SUM(clicks),0)" ) );
                       },
                      'facebook_ads'=>function($query){
                         $query->select( DB::raw( "COALESCE(SUM(clicks),0)" ) );
                       },
                      'google_ads'=>function($query){
                         $query->select( DB::raw( "COALESCE(SUM(clicks),0)" ) );
                       }])->get();

COALESCE - это функция SQL, которая возвращает сумму, если существует, иначе возвращает 0 вместо возврата нуля.

ОБНОВЛЕНИЕ: Если вы хотите получить отдельные столбцы суммирования, вы должны определить индекс для каждого из них и присвоить им псевдонимы следующим образом:

$websites = Website::withCount(['valid_click_ads as firstRes'=>function($query){
                     $query->select( DB::raw( "COALESCE(SUM(col1),0)" ) );
                   },
                   'valid_click_ads as secondRes'=>function($query){
                     $query->select( DB::raw( "COALESCE(SUM(col2),0)" ) );
                   }
                  ])->get();

и т. Д.

...