Campaigns.php 3.23 KB
<?php

namespace App\Models;

use App\Models\Pivots\CampaignVariable;
use App\Models\Pivots\DictionaryCampaign;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Campaigns extends Model
{
    use HasFactory;

    protected $fillable = [
        'external_id',
        'token',
        'name',
        'time_targeting',
        'negative_keywords',
        'blocked_ips',
        'excluded_sites',
        'daily_budget',
        'text_campaign_strategy_search',
        'text_campaign_strategy_network',
        'settings',
        'counter_ids',
        'relevant_keywords_setting_budget_percent',
        'relevant_keywords_setting_optimize_goal_id',
        'attribution_model',
        'updated',
        'manage',
        'enabled',
    ];

    protected $casts = [
        'external_id' => 'int',
        'manage' => 'boolean',
        'enabled' => 'boolean',
        'groups_loaded_at' => 'datetime',
    ];

    public static function boot()
    {
        parent::boot();

        static::updated(function(Campaigns $campaign)
        {
            if ($campaign->manage !== $campaign->getOriginal('manage')) {
                if ($campaign->manage) {
                    Dictionary::whereNotNull('token_id')->each(function (Dictionary $dictionary) use ($campaign) {
                        $campaign->dictionaries()->syncWithoutDetaching([
                            $dictionary->getKey() => DictionaryCampaign::copyPropertyInCampaign($campaign),
                        ]);
                    });
                } else {
                    $campaign->dictionaries()->detach();
                    //$campaign->variables()->detach();
                }
            }
        });

        /*
        static::deleting(function(Campaigns $campaign_delete)
        {
            $campaign_delete->dictionaries()->detach();
            $campaign_delete->variables()->detach();
            $campaign_delete->groups()->delete();
        });
        */
    }

    public function groups()
    {
        return $this->hasMany(AdGroup::class, 'campaign_id');
    }

    public function variables()
    {
        return $this->belongsToMany(Variable::class, 'campaign_variables', 'campaign_id', 'variable_id')
            ->using(CampaignVariable::class)
            ->withPivot(CampaignVariable::getWithPivot())
            ->withTimestamps();
    }

    public function dictionaries()
    {
        return $this->belongsToMany(Dictionary::class, 'dictionary_campaigns', 'campaign_id', 'dictionary_id')
            ->using(DictionaryCampaign::class)
            ->withPivot(DictionaryCampaign::getWithPivot())
            ->withTimestamps();
    }

    public function scopeForUpdated($query)
    {
        $query->whereNotNull('updated');
    }

    public function scopeForGroupsLoadable($query)
    {
        $query->whereNull('groups_loaded_at');
    }

    public function scopeForManaged($query)
    {
        $query->where('manage', true);
    }

    public function scopeNotForManaged($query)
    {
        $query->where('manage', false);
    }

    public function scopeForEnabled($query)
    {
        $query->where('enabled', true);
    }

    public function scopeNotForEnabled($query)
    {
        $query->where('enabled', false);
    }
}