DictionaryCampaignsSyncByCampaign.php 3.27 KB
<?php

namespace App\Console\Commands;

use App\Models\AdGroup;
use App\Models\Campaigns;
use App\Models\Keyword;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup;
use App\Models\Pivots\GoalKeyword;
use Illuminate\Console\Command;

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',
                        'dictionary_campaign_external_id',
                        'goal_ad_group_id',
                        'goal_ad_group_external_id',
                        'keyword_id',
                        'deleted_at',
                    ], [
                        'dictionary_campaign_id',
                        'dictionary_campaign_external_id',
                        'goal_ad_group_id',
                        'goal_ad_group_external_id',
                        'keyword_id',
                        'deleted_at',
                    ]);

                    $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,
                ]);

            });

        });

        return 0;
    }
}