Keyword.php 4.62 KB
<?php

namespace App\Models;

use App\Models\Pivots\GoalKeyword;
use App\Models\Pivots\GoalKeywordDelete;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Collection;

/**
 * App\Models\Keyword
 *
 * @property int $id
 * @property int $external_id
 * @property int $ad_group_external_id
 * @property int $campaign_external_id
 * @property int $ad_group_id
 * @property int $campaign_id
 * @property string|null $keyword
 * @property string|null $user_param_1
 * @property string|null $user_param_2
 * @property int|null $bid
 * @property int|null $context_bid
 * @property string|null $strategy_priority
 * @property string|null $state
 * @property string|null $status
 * @property string|null $serving_status
 * @property \Illuminate\Support\Carbon|null $created_at
 * @property \Illuminate\Support\Carbon|null $updated_at
 * @property-read \App\Models\Campaigns $campaign
 * @property-read \Illuminate\Database\Eloquent\Collection|GoalKeyword[] $goalKeywords
 * @property-read int|null $goal_keywords_count
 * @property-read \App\Models\AdGroup $group
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword newModelQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword newQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword query()
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereAdGroupExternalId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereAdGroupId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereBid($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereCampaignExternalId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereCampaignId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereContextBid($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereCreatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereExternalId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereKeyword($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereServingStatus($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereState($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereStatus($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereUpdatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereUserParam1($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Keyword whereUserParam2($value)
 * @mixin \Eloquent
 */
class Keyword extends Model
{
    use SoftDeletes;

    const STRATEGY_PRIORITY_LOW = 'LOW';
    const STRATEGY_PRIORITY_NORMAL = 'NORMAL';
    const STRATEGY_PRIORITY_HIGH = 'HIGH';

    const STATE_OFF = 'OFF';
    const STATE_ON = 'ON';
    const STATE_SUSPENDED = 'SUSPENDED';

    const STATUS_ACCEPTED = 'ACCEPTED';
    const STATUS_DRAFT = 'DRAFT';
    const STATUS_REJECTED = 'REJECTED';
    const STATUS_UNKNOWN = 'UNKNOWN';

    const SERVING_STATUS_ELIGIBLE = 'ELIGIBLE';
    const SERVING_STATUS_RARELY_SERVED = 'RARELY_SERVED';

    protected $fillable = [
        'external_id',
        'ad_group_external_id',
        'campaign_external_id',
        'ad_group_id',
        'campaign_id',
        'keyword',
        'user_param_1',
        'user_param_2',
        'bid',
        'context_bid',
        'state',
        'status',
        'serving_status',
        'updated_self',
    ];

    protected $casts = [
        'updated_self' => 'datetime',
    ];

    /**
     * @return Collection
     */
    static public function getPropertiesWatch()
    {
        return collect([
            'keyword',
            'user_param_1',
            'user_param_2',
        ]);
    }

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

        static::deleted(function (Keyword $keyword) {

            if (!$keyword->isForceDeleting()) {

                $keyword->goalKeywords->each(function (GoalKeyword $goalKeyword) {

                    GoalKeywordDelete::updateOrCreateByMain($goalKeyword);

                    $goalKeyword->delete();

                });

            }

        });
    }

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

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

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

}