DictionaryCampaign.php 10.6 KB
<?php

namespace App\Models\Pivots;

use App\Models\Campaigns;
use App\Models\Dictionary;
use App\Models\Variable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Pivot;
use Illuminate\Support\Collection;

/**
 * App\Models\Pivots\DictionaryCampaign
 *
 * @property-read Campaigns $campaign
 * @property-read Dictionary $dictionary
 * @property-read DictionaryCampaignVariable[] $dictionaryCampaignVariables
 * @property-read Variable[] $variables
 * @property-read GoalAdGroup[] $groups
 * @property-read GoalAdGroup[] $groupsForNotExternal
 * @property-read GoalAdGroup[] $groupsForExternalForUpdatedSelf
 * @property-read GoalAdGroup[] $groupsForExternalForNeedUpdated
 * @mixin \Eloquent
 * @property int $id
 * @property int|null $external_id
 * @property int $campaign_id
 * @property int $dictionary_id
 * @property string|null $name
 * @property array|null $negative_keywords
 * @property array|null $excluded_sites
 * @property bool $enabled
 * @property bool $updated
 * @property bool $synced
 * @property \Illuminate\Support\Carbon|null $external_upload_at
 * @property \Illuminate\Support\Carbon|null $created_atd
 * @property \Illuminate\Support\Carbon|null $updated_at
 * @property-read int|null $dictionary_campaign_variables_count
 * @property-read int|null $variables_count
 * @property-read int|null $groups_count
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign forExternal()
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign notDisabled()
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign disabled()
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign forNotExternal()
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign needUpdated()
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign enabled($value = true)
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign forUpdated($value = true)
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign synced($value = true)
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign synchronized()
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign forUpdatedSelf()
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign forUpdatedChildren()
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign joinDictionaries()
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign newModelQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign newQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign query()
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereExternalId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereCampaignId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereCreatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereDictionaryId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereExcludedSites($value)
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereName($value)
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereNegativeKeywords($value)
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereUpdatedNeed($value)
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereUpdated($value)
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereUpdatedAt($value)
 * @method static Builder|DictionaryCampaign whereExternalUploadAt($value)
 * @property \Illuminate\Support\Carbon|null $external_updated_at
 * @property \Illuminate\Support\Carbon|null $updated_need
 * @property \Illuminate\Support\Carbon|null $updated_self
 * @property \Illuminate\Support\Carbon|null $updated_children
 * @property \Illuminate\Support\Carbon|null $disabled_at
 * @property \Illuminate\Support\Carbon|null $created_at
 * @method static Builder|DictionaryCampaign whereDisabledAt($value)
 * @method static Builder|DictionaryCampaign whereEnabled($value)
 * @method static Builder|DictionaryCampaign whereExternalUpdatedAt($value)
 * @method static Builder|DictionaryCampaign whereSynced($value)
 * @method static Builder|DictionaryCampaign whereUpdatedChildren($value)
 * @method static Builder|DictionaryCampaign whereUpdatedSelf($value)
 */
class DictionaryCampaign extends Pivot
{

    protected $table = 'dictionary_campaigns';

    protected $fillable = [
        'external_id',
        'campaign_id',
        'dictionary_id',
        'name',
        'negative_keywords',
        'excluded_sites',
        'external_upload_at',
        'external_updated_at',
        'updated_need',
        'updated_self',
        'updated_children',
        'enabled',
        'updated',
        'synced',
        'disabled_at',
    ];

    protected $casts = [
        'negative_keywords' => 'array',
        'excluded_sites' => 'array',
        'external_upload_at' => 'datetime',
        'external_updated_at' => 'datetime',
        'updated_need' => 'datetime',
        'updated_self' => 'datetime',
        'updated_children' => 'datetime',
        'enabled' => 'boolean',
        'updated' => 'boolean',
        'synced' => 'boolean',
        'disabled_at' => 'datetime',
    ];

    static public function getWithPivot()
    {
        return [
            'id',
            'external_id',
            'name',
            'negative_keywords',
            'excluded_sites',
            'external_upload_at',
            'external_updated_at',
            'updated_need',
            'updated_self',
            'updated_children',
            'enabled',
            'updated',
            'synced',
            'disabled_at',
        ];
    }

    /**
     * @return Collection
     */
    static public function getPropertiesCopyWithPivot()
    {
        return collect([
            'name',
            'negative_keywords',
            'excluded_sites',
        ]);
    }

    /**
     * @param Campaigns|array $campaign
     *
     * @return array
     */
    static public function copyPropertyFromMain($campaign)
    {
        return self::getPropertiesCopyWithPivot()
            ->transform(function ($property_name) use ($campaign) {
                $value = null;

                if ($campaign instanceof Campaigns) {
                    $value = $campaign->{$property_name};
                } elseif (is_array($campaign) && isset($campaign[$property_name])) {
                    $value = $campaign[$property_name];
                }

                return [
                    $property_name => $value
                ];
            })->flatMap(function ($val) {
                return $val;
            })->all();
    }

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeDisabled($query)
    {
        return $query->whereNotNull('disabled_at');
    }

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeNotDisabled($query)
    {
        return $query->whereNull('disabled_at');
    }

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeForExternal($query)
    {
        return $query->whereNotNull('external_id');
    }

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeForNotExternal($query)
    {
        return $query->whereNull('external_id');
    }

    /**
     * @param Builder $query
     * @param bool $enabled
     * @return Builder
     */
    public function scopeEnabled($query, $enabled = true)
    {
        return $query->where('enabled', $enabled);
    }

    /**
     * @param Builder $query
     * @param bool $updated
     * @return Builder
     */
    public function scopeForUpdated($query, $updated = true)
    {
        return $query->where('updated', $updated);
    }

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeNeedUpdated($query)
    {
        return $query->whereNotNull('updated_need');
    }

    /**
     * @param Builder $query
     * @param bool $synced
     * @return Builder
     */
    public function scopeSynced($query, $synced = true)
    {
        return $query->where('synced', $synced);
    }

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeSynchronized($query)
    {
        return $query->synced()->forUpdated();
    }

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeForUpdatedSelf($query)
    {
        return $query->whereNotNull('updated_self');
    }

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeForUpdatedChildren($query)
    {
        return $query->whereNotNull('updated_children');
    }

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeJoinDictionaries($query)
    {
        $dictionary_model = Dictionary::getModel();

        return $query->join($dictionary_model->getTable(), "{$query->getModel()->table()}.dictionary_id", '=', "{$dictionary_model->getTable()}.{$dictionary_model->getKeyName()}");
    }

    public function dictionary()
    {
        return $this->belongsTo(Dictionary::class, 'dictionary_id');
    }

    public function campaign()
    {
        return $this->belongsTo(Campaigns::class, 'campaign_id');
    }

    public function dictionaryCampaignVariables()
    {
        return $this->hasMany(DictionaryCampaignVariable::class, 'dictionary_campaign_id');
    }

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

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

    public function groupsForNotExternal()
    {
        return $this->groups()->forNotExternal();
    }

    public function groupsForExternalForUpdatedSelf()
    {
        return $this->groups()->forExternal()->forUpdatedSelf();
    }

    public function groupsForExternalForNeedUpdated()
    {
        return $this->groups()->forExternal()->needUpdated();
    }

    public function goalKeywords()
    {
        return $this->hasMany(GoalKeyword::class, 'dictionary_campaign_id');
    }

}