Laravel Eloquent 预加载总和

Laravel Eloquent Eager Load Sums

我在加载页面之前使用预先加载来加载数据,以缩短加载时间。

$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();

这将使加载时间更短!谢谢!

没有这样的东西,但您可以使用 withCount 方法作为 sum 的包装器:

$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 函数,用于 return 求和 else returns 0 而不是 returning null。

更新: 如果你想检索单独的求和列,你必须为它们中的每一个定义一个索引并像这样给它们起别名:

$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();

等..