php - Laravel Eloquent 关系——如何组合 id 和 date 上的两个关系?

标签 php mysql laravel eloquent relationship

我正在尝试按天拉动我的每个网站的支出和收入。

我有一个网站模型,我正在尝试将其建立为一种关系。

我已经为每项支出和收入建立了关系

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

关于如何在此关系中或在调用各个关系之后组合这些查询有什么想法吗?

最佳答案

您对 Eloquent 关系系统的插入程度给我留下了深刻的印象。我曾在某个时候尝试过其中的一些技巧。但最近我终于改变了我的观点,尤其是关于统计数据。

您不需要 Eloquent 来获取基于多个分组依据等的统计信息。 Eloquent 适用于 CRUD、使用观察者处理事件、使用作用域、更改器(mutator)和预加载等功能,在许多情况下它确实很棒。

在你的情况下,我建议你自己编写原始sql查询,最终你会更好地控制它。

除此之外,如果您的查询确实太长而无法执行,您可以

  • 检查 SQL 执行计划和缺失索引以进行优化

  • 如果这不能解决性能问题,您将需要将数据合并到特定的统计表中,这意味着您将存储该 daily_stats 查询/关系的所有结果,并使用计划任务通过截断来刷新该表& 每小时再次执行一次查询。这将确保您的统计数据在用户界面上快速弹出。另外,由于查询在后台运行,您并不关心执行是否需要几分钟......

关于php - Laravel Eloquent 关系——如何组合 id 和 date 上的两个关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54790950/

相关文章:

php - 如何在 CodeIgniter 中的一次提交中插入多行

php - 在同一个 VPS 上使用 php 执行 ssh 文件

php - 显示多表mysql查询

Mysql select 查询同一列的多个条件

laravel - 通过模块的 Composer 安装包时无法识别错误类名

php - 没有在 Eloquent 模型中设置表

javascript - Magento - validator 和 validator.validate() 之间的区别

.js 文件中的 php 标签

PHP表单处理问题

php - 如何将数组值从一个方法传递给 Laravel 中的另一个方法?