Laravel Eloquent Eager Load с суммами - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь найти лучший способ загружать много данных, чтобы мой проект мог загружаться быстро и легко.Как вы можете видеть ниже, между нашими объектами существует множество взаимосвязей, и для каждого уровня потребуются суммы, рассчитанные и отображаемые много раз.Мне интересно, как быстро загрузить и отобразить эти данные.

Отношения:

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

Вот данные, которые мне нужны.Я рассчитываю получить эти данные практически на каждом уровне отношений (все данные для WHERE созданной_дней = сегодня)

Object -> name
          sum(valid_click_ads->revenue)
          sum(facebook_ads->spend)
          sum(yahoo_ads->spend)
          sum(google_ads->spend)
          sum(valid_click_ads->tq WHERE tq != -1)
          count(tq)
          sum(CASE(tq = -1, 0, 1))
          sum(facebook_ads->impressions)
          sum(yahoo_ads->impressions)
          sum(google_ads->impressions)
          sum(facebook_ads->clicks)
          sum(yahoo_ads->clicks)
          sum(google_ads->clicks)
          sum(valid_click_ads->clicks)

Я был бы рад предоставить дополнительную информацию, если это необходимо.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Используя эту статью, я смог собрать именно то, что мне нужно, вот так ...

Модели веб-сайтов, кампаний и групп:

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();
0 голосов
/ 25 мая 2018

Если я правильно понимаю вашу проблему, вы можете использовать что-то вроде этого:

Website::withCount(['valid_click_ads' => function($query) {
    $query->select(DB::raw('sum(revenue)'))
        ->where('created_at', ...);
}])->get();
...