DictionaryCampaignsSyncByCampaign.php 5.71 KB
<?php

namespace App\Console\Commands;

use App\Models\AdGroup;
use App\Models\Campaigns;
use App\Models\Dictionary;
use App\Models\Keyword;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup;
use App\Models\Pivots\GoalKeyword;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class DictionaryCampaignsSyncByCampaign extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'dictionarycampaigns:sync';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Синхроннизиировать связанные данные основныйх РК с целевыми рк';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
//        Campaigns::has('dictionaryCampaignSynchronizedNeedSynced')->forManaged()->get()->each(function (Campaigns $campaign) {
//            $campaign->load([
//                'groupsForNotKeywordsLoadable.keywords',
//                'dictionaryCampaignSynchronizedNeedSynced'
//            ]);
////хоть и есть нужные, а тут они не выберутся. Видимо потому что был сбой, а в кампании записано что все хорошо
//            $campaign->dictionaryCampaignSynchronizedNeedSynced->each(function (DictionaryCampaign $dictionaryCampaign) use ($campaign) {
//
//                $campaign->groupsForNotKeywordsLoadable->each(function (AdGroup $adGroup) use ($dictionaryCampaign) {
//
//                    $goalAdGroup = GoalAdGroup::updateOrCreateByMain($adGroup, $dictionaryCampaign);
//
//                    $data_keywords = $adGroup->keywords->map(function (Keyword $keyword) use ($goalAdGroup, $dictionaryCampaign) {
//                        return GoalKeyword::getDataByMain($keyword, $goalAdGroup, $dictionaryCampaign);
//                    })->toArray();
//
//                    GoalKeyword::upsert($data_keywords, [
//                        'dictionary_campaign_id',
//                        'goal_ad_group_id',
//                        'keyword_id',
//                    ], [
//                        'dictionary_campaign_id',
//                        'dictionary_campaign_external_id',
//                        'goal_ad_group_id',
//                        'goal_ad_group_external_id',
//                        'keyword_id',
//                    ]);
//
//                    $goalKeywordQuery = GoalKeyword::where('dictionary_campaign_id', $dictionaryCampaign->getKey())
//                        ->where('goal_ad_group_id', $goalAdGroup->getKey());
//
//                    if (count($data_keywords)) {
//                        $goalKeywordQuery->whereNotIn('keyword_id', array_column($data_keywords, 'keyword_id'));
//                    }
//
//                    $goalKeywords = $goalKeywordQuery->get();
//
//                    $goalKeywords->each(function (GoalKeyword $goalKeyword) {
//                        $goalKeyword->delete();
//                    });
//
//                });
//
//                $dictionaryCampaign->update([
//                    'synced_need' => null,
//                ]);
//
//            });
//
//        });

        $cities = Dictionary::where('token_id', '>', 0)->get();

        foreach ($cities as $city){
            //грузиим РК которых по какой то причне нет в целевых.
            DB::insert("
                INSERT INTO dictionary_campaigns(campaign_id, dictionary_id, name, negative_keywords, excluded_sites)
                SELECT c.id, {$city->id}, c.name, c.negative_keywords, c.excluded_sites
                FROM campaigns c
                 LEFT JOIN dictionary_campaigns dc on c.id = dc.campaign_id AND dc.dictionary_id={$city->id}
                WHERE dc.campaign_id is null AND c.manage=1
                            ");
        }

        //грузим группы которых по какой то причне нет в целевых.
        DB::insert("
                INSERT INTO goal_ad_groups(ad_group_id, dictionary_campaign_external_id, dictionary_campaign_id, name, negative_keywords)
                SELECT a.id, dc.external_id, dc.id,  a.name, a.negative_keywords
                FROM ad_groups a
                    INNER JOIN campaigns c on a.campaign_id = c.id
                    INNER JOIN dictionary_campaigns dc on c.id = dc.campaign_id
                    LEFT JOIN goal_ad_groups gag on a.id = gag.ad_group_id AND gag.dictionary_campaign_id=dc.id
                WHERE gag.ad_group_id is null
                            ");

        //грузим ключевые фразы которых по какой то причне нет в целевых.
        DB::insert("
                INSERT INTO goal_keywords(dictionary_campaign_external_id, goal_ad_group_external_id, dictionary_campaign_id,
                          goal_ad_group_id, keyword_id)
                    SELECT gag.dictionary_campaign_id, gag.external_id, gag.dictionary_campaign_id, gag.id, k.id
                    FROM keywords k
                        INNER JOIN ad_groups ag on k.ad_group_id = ag.id
                        INNER JOIN goal_ad_groups gag on ag.id = gag.ad_group_id
                         LEFT JOIN goal_keywords gk on k.id = gk.keyword_id AND gk.goal_ad_group_id=gag.id
                    WHERE gk.keyword_id is null
                            ");

        DictionaryCampaign::needSynced()->update([
            'synced_need' => null,
        ]);

        return 0;
    }
}