Laravel 拉拉维尔口若悬河的渴望和负荷

Laravel 拉拉维尔口若悬河的渴望和负荷,laravel,eloquent,eager-loading,Laravel,Eloquent,Eager Loading,我正试图找出最好的方法来加载大量数据,以便我的项目能够快速、轻松地加载。正如您在下面看到的,我们的对象之间有很多关系,每个级别都需要多次计算和显示总和。我想知道如何快速加载和显示这些数据 关系: Website has campaigns, groups, keywords, valid_click_ads, facebook_ads, google_ads, yahoo_ads Campaign has groups, keywords, valid_click_ads, facebook_a

我正试图找出最好的方法来加载大量数据,以便我的项目能够快速、轻松地加载。正如您在下面看到的,我们的对象之间有很多关系,每个级别都需要多次计算和显示总和。我想知道如何快速加载和显示这些数据

关系:

Website has campaigns, groups, keywords, valid_click_ads, facebook_ads, google_ads, yahoo_ads
Campaign has groups, keywords, valid_click_ads, facebook_ads, google_ads, yahoo_ads
Group has keywords, valid_click_ads, facebook_ads, google_ads, yahoo_ads
Keywords has valid_click_ads
这是我需要的数据。我希望基本上在每个关系级别上都能得到这些数据(所有创建位置的数据=今天)


如有必要,我很乐意提供更多信息。

如果我正确理解您的问题,您可以使用以下内容:

Website::withCount(['valid\u click\u ads'=>函数($query){
$query->select(DB::raw('sum(revenue)'))
->其中('created_at',…);
}])->get();
通过这篇文章,我能够准确地组合出我所需要的东西,就像这样。。。

网站、活动和组模型:

public function getValidClickSumsAttribute() {
    if ( ! $this->relationLoaded('validClickSums')) 
        $this->load('validClickSums');

    $related = $this->getRelation('validClickSums');

    return $related;
}

public function facebookSums() {
    return $this->hasOne('App\Models\FacebookAd')->selectRaw('sum(spend) as spend, sum(clicks) as clicks, website_id')->groupBy('website_id');
}

public function getFacebookSumsAttribute() {
    if ( ! $this->relationLoaded('facebookSums')) 
        $this->load('facebookSums');

    $related = $this->getRelation('facebookSums');

    return $related;
}

public function googleSums() {
    return $this->hasOne('App\Models\GoogleAd')->selectRaw('sum(spend) as spend, sum(clicks) as clicks, website_id')->groupBy('website_id');
}

public function getGoogleSumsAttribute() {
    if ( ! $this->relationLoaded('googleSums')) 
        $this->load('googleSums');

    $related = $this->getRelation('googleSums');

    return $related;
}

public function yahooSums() {
    return $this->hasOne('App\Models\YahooAd')->selectRaw('sum(spend) as spend, sum(clicks) as clicks, website_id')->groupBy('website_id');
}

public function getYahooSumsAttribute() {
    if ( ! $this->relationLoaded('yahooSums')) 
        $this->load('yahooSums');

    $related = $this->getRelation('yahooSums');

    return $related;
}

关键词模型:

public function validClickSums() {
    return $this->hasOne('App\Models\ValidClickAd')->selectRaw('sum(impressions) as impressions, sum(revenue) as revenue, sum(clicks) as clicks, count(tq) as unscored_tq_count, sum(case when tq >= 0 then 1 else 0 end) as scored_tq_count, sum(case when tq >= 0 then tq else 0 end) as tq, keyword_id')->groupBy('keyword_id');
}

public function getValidClickSumsAttribute() {
    if ( ! $this->relationLoaded('validClickSums')) 
        $this->load('validClickSums');

    $related = $this->getRelation('validClickSums');

    return $related;
}

控制器:

    $websites = Website::select('name', 'id')->
        with(
            array(
                'validClickSums' => function( $query ) {
                    $query->where( 'user_id', '=', 2 );
                },
                'facebookSums' => function( $query ) {
                    $query->where( 'user_id', '=', 2 );
                },
                'googleSums' => function( $query ) {
                    $query->where( 'user_id', '=', 2 );
                },
                'yahooSums' => function( $query ) {
                    $query->where( 'user_id', '=', 2 );
                },
                'campaigns' => function( $query ) {
                    $query->where( 'user_id', '=', 2 )->with(
                        array(
                            'validClickSums' => function( $query ) {
                                $query->where( 'user_id', '=', 2 );
                            },
                            'facebookSums' => function( $query ) {
                                $query->where( 'user_id', '=', 2 );
                            },
                            'googleSums' => function( $query ) {
                                $query->where( 'user_id', '=', 2 );
                            },
                            'yahooSums' => function( $query ) {
                                $query->where( 'user_id', '=', 2 );
                            },
                            'traffic_source',
                            'groups' => function( $query ) {
                                $query->with(
                                    array(
                                        'validClickSums' => function( $query ) {
                                            $query->where( 'user_id', '=', 2 );
                                        },
                                        'facebookSums' => function( $query ) {
                                            $query->where( 'user_id', '=', 2 );
                                        },
                                        'googleSums' => function( $query ) {
                                            $query->where( 'user_id', '=', 2 );
                                        },
                                        'yahooSums' => function( $query ) {
                                            $query->where( 'user_id', '=', 2 );
                                        },
                                        'keywords' => function( $query ) {
                                            $query->with(
                                                array(
                                                    'validClickSums' => function( $query ) {
                                                        $query->where( 'user_id', '=', 2 );
                                                    },
                                                    'sourceSums' => function( $query ) {
                                                        $query->where( 'user_id', '=', 2 );
                                                    }
                                                )
                                            );
                                        }
                                    )
                                );
                            }
                        )
                    );
                }
            )
        )->get();

您可以创建新的关系,作为其定义的一部分执行
sum()
。看见缓存也可能是一种选择。您是否有一个示例说明如何处理更大的关系和数据组?在一个特定的日期范围内,你可以将所有有说服力的功能应用于一段关系的功能。您可以将
whereBetween
子句添加到关系的日期范围定义中,而不存在任何问题。它们仍然有可能成为计算成本很高的查询,从而减缓了数据库的速度。你可能最终会考虑将这些类型的分析卷以另一种方式存储。否则我还能存储这些数据吗?@你的答案实际上帮助了我很多。非常感谢。
    $websites = Website::select('name', 'id')->
        with(
            array(
                'validClickSums' => function( $query ) {
                    $query->where( 'user_id', '=', 2 );
                },
                'facebookSums' => function( $query ) {
                    $query->where( 'user_id', '=', 2 );
                },
                'googleSums' => function( $query ) {
                    $query->where( 'user_id', '=', 2 );
                },
                'yahooSums' => function( $query ) {
                    $query->where( 'user_id', '=', 2 );
                },
                'campaigns' => function( $query ) {
                    $query->where( 'user_id', '=', 2 )->with(
                        array(
                            'validClickSums' => function( $query ) {
                                $query->where( 'user_id', '=', 2 );
                            },
                            'facebookSums' => function( $query ) {
                                $query->where( 'user_id', '=', 2 );
                            },
                            'googleSums' => function( $query ) {
                                $query->where( 'user_id', '=', 2 );
                            },
                            'yahooSums' => function( $query ) {
                                $query->where( 'user_id', '=', 2 );
                            },
                            'traffic_source',
                            'groups' => function( $query ) {
                                $query->with(
                                    array(
                                        'validClickSums' => function( $query ) {
                                            $query->where( 'user_id', '=', 2 );
                                        },
                                        'facebookSums' => function( $query ) {
                                            $query->where( 'user_id', '=', 2 );
                                        },
                                        'googleSums' => function( $query ) {
                                            $query->where( 'user_id', '=', 2 );
                                        },
                                        'yahooSums' => function( $query ) {
                                            $query->where( 'user_id', '=', 2 );
                                        },
                                        'keywords' => function( $query ) {
                                            $query->with(
                                                array(
                                                    'validClickSums' => function( $query ) {
                                                        $query->where( 'user_id', '=', 2 );
                                                    },
                                                    'sourceSums' => function( $query ) {
                                                        $query->where( 'user_id', '=', 2 );
                                                    }
                                                )
                                            );
                                        }
                                    )
                                );
                            }
                        )
                    );
                }
            )
        )->get();