我正在尝试逐日增加每个网站的支出和收入。
我有一个网站模型,我正在尝试建立这种关系。
我已经有了每笔支出和有效收入的关系
public function daily_spend() {
return $this->hasMany('App\Models\Spend')->
selectRaw('sum(spend) as spend, sum(clicks) as clicks, sum(leads) as leads, website_id, DATE( created_at ) as date' )->
groupBy( DB::raw( 'website_id, DATE( created_at )' ) )->
orderBy( DB::raw( 'DATE( created_at )' ) );
}
public function daily_revenue() {
return $this->hasMany('App\Models\Spend')->
selectRaw('sum(impressions) as impressions, sum(revenue) as revenue, sum(clicks) as clicks, sum(clicks) as unscored_tq_count, sum(case when tq > 0 then clicks else 0 end) as scored_tq_count, sum(case when tq >= 0 then tq * clicks else 0 end) as tq, website_id')->
groupBy('website_id')->
orderBy( DB::raw( 'DATE( created_at )' ) );
}
然后获取我称之为的数据:
$start = '2019-02-01 00:00:00';
$stop = '2019-02-21 23:59:59';
Website::with( array(
'daily_spend' => function( $query ) use ( $start, $stop ) {
$query->whereBetween( 'created_at', [ $start, $stop ] );
},
'daily_revenue' => function( $query ) use ( $start, $stop ) {
$query->whereBetween( 'created_at', [ $start, $stop ] );
}
))->get();
这很好用,除了我需要能够将日期和website_id上的这些值组合在一起,以防错过一天的收入或支出。我尝试了下面的内容,但它会永远加载。
public function daily_data() {
return $this->hasMany('App\Models\Spend', 'website_id', 'id')->
selectRaw('sum(spend.spend) as spend, sum(spend.clicks) as clicks, sum(spend.leads) as leads, spend.website_id, sum(spend.impressions) as impressions, sum(revenue.revenue) as revenue, sum(revenue.users) as users, avg( revenue.cpm ) as cpm, DATE( revenue.created_at ) as date' )->
join( 'revenue', DB::raw( 'spend.website_id' ), '=', DB::raw( 'revenue.website_id AND DATE( spend.created_at ) = DATE( revenue.created_at )' ) )->
groupBy( DB::raw( 'spend.website_id, DATE( spend.created_at )' ) )->
orderBy( DB::raw( 'DATE( spend.created_at )' ) );
}
Website::with( array(
'daily_data' => => function( $query ) use ( $start, $stop ) {
$query->whereBetween( 'created_at', [ $start, $stop ] );
}
))->get();
关于如何在此关系内或在调用各个关系后组合这些查询的任何想法?
答案 0 :(得分:1)
您对Eloquent关系系统的推动力给我留下了深刻的印象。我有时会自己尝试一些技巧。但是最近我终于改变了观点,尤其是关于统计数据。
您不需要Eloquent即可获得基于多个分组依据的统计信息,依此类推。雄辩的意思是诸如CRUD,与观察者一起处理事件,使用范围,变异器和渴望加载之类的事情,在很多情况下,它确实很棒。
根据您的情况,我建议您自己编写原始sql查询,最终您将可以更好地控制它。
除此之外,如果您的查询时间太长而无法执行,则可以
检查SQL执行计划和缺少索引以进行优化
如果这不能解决性能问题,则需要将数据合并到特定的stat表中,这意味着您将存储来自daily_stats查询/关系的所有结果,并使用计划任务通过截断来刷新该表&每小时再次执行查询。这样可以确保您的统计信息在用户界面上快速弹出。另外,由于查询是在后台运行的,因此您无需担心执行时间是否会花费几分钟。...