GoalKeyword.php 5.52 KB
<?php

namespace App\Models\Pivots;

use App\Models\Keyword;
use App\Models\YandexError;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Pivot;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;

/**
 * App\Models\Pivots\GoalKeyword
 *
 * @property int $id
 * @property int|null $external_id
 * @property int|null $dictionary_campaign_external_id
 * @property int|null $goal_ad_group_external_id
 * @property int $dictionary_campaign_id
 * @property int $goal_ad_group_id
 * @property int $keyword_id
 * @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 $created_at
 * @property \Illuminate\Support\Carbon|null $updated_at
 * @property-read Keyword $keyword
 * @method static Builder|GoalKeyword forExternal()
 * @method static Builder|GoalKeyword forNotExternal()
 * @method static Builder|GoalKeyword needUpdated()
 * @method static Builder|GoalKeyword newModelQuery()
 * @method static Builder|GoalKeyword newQuery()
 * @method static Builder|GoalKeyword query()
 * @method static Builder|GoalKeyword whereCreatedAt($value)
 * @method static Builder|GoalKeyword whereDictionaryCampaignExternalId($value)
 * @method static Builder|GoalKeyword whereDictionaryCampaignId($value)
 * @method static Builder|GoalKeyword whereExternalId($value)
 * @method static Builder|GoalKeyword whereExternalUpdatedAt($value)
 * @method static Builder|GoalKeyword whereExternalUploadAt($value)
 * @method static Builder|GoalKeyword whereGoalAdGroupExternalId($value)
 * @method static Builder|GoalKeyword whereGoalAdGroupId($value)
 * @method static Builder|GoalKeyword whereId($value)
 * @method static Builder|GoalKeyword whereKeywordId($value)
 * @method static Builder|GoalKeyword whereUpdatedAt($value)
 * @method static Builder|GoalKeyword whereUpdatedNeed($value)
 * @mixin \Eloquent
 */
class GoalKeyword extends Pivot
{

    protected $table = 'goal_keywords';

    protected $fillable = [
        'external_id',
        'goal_ad_group_external_id',
        'dictionary_campaign_external_id',
        'goal_ad_group_id',
        'dictionary_campaign_id',
        'keyword_id',
        'external_upload_at',
        'external_updated_at',
        'updated_need',
        'reserve_create_at',
        'reserve_update_at',
        'reserve_delete_at',
    ];

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

    public $incrementing = true;

    static public function getWithPivot()
    {
        return [
            'id',
            'external_id',
            'goal_ad_group_external_id',
            'dictionary_campaign_external_id',
            'goal_ad_group_id',
            'dictionary_campaign_id',
            'keyword_id',
            'external_upload_at',
            'external_updated_at',
            'updated_need',
            'reserve_create_at',
            'reserve_update_at',
            'reserve_delete_at',
        ];
    }

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

        static::deleted(function (GoalKeyword $goalKeyword) {
            GoalKeywordDelete::updateOrCreateByMain($goalKeyword);
        });
    }

    /**
     * @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 scopeNeedUpdated($query)
    {
        return $query->whereNotNull('updated_need');
    }

    public function keyword()
    {
        return $this->belongsTo(Keyword::class, 'keyword_id');
    }

    public function goalAdGroup()
    {
        return $this->belongsTo(GoalAdGroup::class, 'goal_ad_group_id');
    }

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

    public static function getForUpdate($token){
        return DB::table('goal_keywords')
            ->join('keywords', 'goal_keywords.keyword_id', '=', 'keywords.id')
            ->whereNull('keywords.deleted_at')
            ->whereNull('goal_keywords.reserve_update_at')
            ->whereNotNull('goal_keywords.updated_need')
            ->whereNotNull('goal_keywords.external_id')
            ->whereNotNull('goal_keywords.goal_ad_group_external_id')
            ->whereNotNull('goal_keywords.dictionary_campaign_external_id')
            ->whereIn('goal_keywords.dictionary_campaign_id', $token->dictionaryCampaignsEnabledForExternalSynchronized->pluck('id'))
            ->select([
                'goal_keywords.id as id',
                'goal_keywords.external_id',
                'goal_keywords.dictionary_campaign_id as dictionary_campaign_id',
                'keywords.keyword as keyword',
                'keywords.user_param_1 as user_param_1',
                'keywords.user_param_2 as user_param_2',
            ])
            ->get();
    }

    public function errors()
    {
        return $this->morphMany(YandexError::class, 'cause');
    }

}