GoalAdGroup.php 7.45 KB
<?php

namespace App\Models\Pivots;

use App\Models\AdGroup;
use App\Models\BidModifier;
use App\Models\Variable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Pivot;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Collection;

/**
 * App\Models\Pivots\GoalAdGroup
 *
 * @property int $id
 * @property int|null $external_id
 * @property int|null $dictionary_campaign_external_id
 * @property int $dictionary_campaign_id
 * @property string|null $name
 * @property array|null $negative_keywords
 * @property \Illuminate\Support\Carbon|null $external_upload_at
 * @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 $created_at
 * @property \Illuminate\Support\Carbon|null $updated_at
 * @property int|null $ad_group_id
 * @property-read \App\Models\Pivots\DictionaryCampaign $dictionaryCampaign
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Pivots\DictionaryCampaignVariable[] $dictionaryCampaignVariables
 * @property-read int|null $dictionary_campaign_variables_count
 * @property-read AdGroup|null $group
 * @property-read \Illuminate\Database\Eloquent\Collection|Variable[] $variables
 * @property-read int|null $variables_count
 * @method static Builder|GoalAdGroup forExternal()
 * @method static Builder|GoalAdGroup forNotExternal()
 * @method static Builder|GoalAdGroup forNotReserveCreate()
 * @method static Builder|GoalAdGroup forNotReserveUpdate()
 * @method static Builder|GoalAdGroup forUpdatedSelf()
 * @method static Builder|GoalAdGroup needUpdated()
 * @method static Builder|GoalAdGroup newModelQuery()
 * @method static Builder|GoalAdGroup newQuery()
 * @method static Builder|GoalAdGroup query()
 * @method static Builder|GoalAdGroup whereAdGroupId($value)
 * @method static Builder|GoalAdGroup whereDictionaryCampaignExternalId($value)
 * @method static Builder|GoalAdGroup whereCreatedAt($value)
 * @method static Builder|GoalAdGroup whereDictionaryCampaignId($value)
 * @method static Builder|GoalAdGroup whereExternalId($value)
 * @method static Builder|GoalAdGroup whereExternalUpdatedAt($value)
 * @method static Builder|GoalAdGroup whereExternalUploadAt($value)
 * @method static Builder|GoalAdGroup whereId($value)
 * @method static Builder|GoalAdGroup whereName($value)
 * @method static Builder|GoalAdGroup whereNegativeKeywords($value)
 * @method static Builder|GoalAdGroup whereUpdatedAt($value)
 * @method static Builder|GoalAdGroup whereUpdatedNeed($value)
 * @method static Builder|GoalAdGroup whereUpdatedSelf($value)
 * @mixin \Eloquent
 */
class GoalAdGroup extends Pivot
{
    use SoftDeletes;

    protected $table = 'goal_ad_groups';

    protected $fillable = [
        'external_id',
        'dictionary_campaign_external_id',
        'ad_group_id',
        'dictionary_campaign_id',
        'name',
        'negative_keywords',
        'external_upload_at',
        'external_updated_at',
        'updated_need',
        'updated_self',
        'reserve_create_at',
        'reserve_update_at',
    ];

    protected $casts = [
        'negative_keywords' => 'array',
        'external_upload_at' => 'datetime',
        'external_updated_at' => 'datetime',
        'updated_need' => 'datetime',
        'updated_self' => 'datetime',
        'reserve_create_at' => 'datetime',
        'reserve_update_at' => 'datetime',
    ];

    public $incrementing = true;

    static public function getWithPivot()
    {
        return [
            'id',
            'external_id',
            'dictionary_campaign_external_id',
            'ad_group_id',
            'dictionary_campaign_id',
            'name',
            'negative_keywords',
            'external_upload_at',
            'external_updated_at',
            'updated_need',
            'updated_self',
            'reserve_create_at',
            'reserve_update_at',
        ];
    }

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

    static public function updateOrCreateByMain(AdGroup $adGroup, DictionaryCampaign $dictionaryCampaign)
    {
        return GoalAdGroup::updateOrCreate([
            'dictionary_campaign_id' => $dictionaryCampaign->getKey(),
            'dictionary_campaign_external_id' => $dictionaryCampaign->external_id,
            'ad_group_id' => $adGroup->getKey(),
            'deleted_at' => null,
        ]);
    }

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

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

                return [
                    $property_name => $value
                ];
            })
            ->collapse()
            ->put('ad_group_id', $ad_group[AdGroup::getModel()->getKeyName()])
            ->all();
    }

    /**
     * @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
     * @return Builder
     */
    public function scopeForNotReserveCreate($query)
    {
        return $query->whereNull('reserve_create_at');
    }

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

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

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

    public function group()
    {
        return $this->belongsTo(AdGroup::class, 'ad_group_id');
    }

    public function dictionaryCampaign()
    {
        return $this->belongsTo(DictionaryCampaign::class, 'dictionary_campaign_id');
    }

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

    public function goalNegativeKeywordSharedSets()
    {
        return $this->belongsToMany(GoalNegativeKeywordSharedSet::class, GoalAdGroupGoalNegativeKeywordSharedSet::getModel()->getTable(), 'goal_ad_group_id', 'goal_negative_keyword_shared_set_id')
            ->using(GoalAdGroupGoalNegativeKeywordSharedSet::class)
            ->withPivot(GoalAdGroupGoalNegativeKeywordSharedSet::getWithPivot())
            ->withTimestamps();
    }

    public function goalAdvertisements()
    {
        return $this->hasMany(GoalAdvertisement::class, 'goal_ad_group_id');
    }

    public function goalBidModifiers()
    {
        return $this->hasMany(GoalBidModifier::class, 'goal_ad_group_id');
    }

}