DictionaryCampaign.php 4.9 KB
<?php

namespace App\Models\Pivots;

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

/**
 * App\Models\Pivots\DictionaryCampaign
 *
 * @property-read Campaigns $campaign
 * @property-read Dictionary $dictionary
 * @property-read DictionaryCampaignVariable[] $dictionaryCampaignVariables
 * @property-read Variable[] $variables
 * @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 int $updated
 * @property \Illuminate\Support\Carbon|null $created_at
 * @property \Illuminate\Support\Carbon|null $updated_at
 * @property-read int|null $dictionary_campaign_variables_count
 * @property-read int|null $variables_count
 * @method static \Illuminate\Database\Eloquent\Builder|Limits forNotExternal()
 * @method static \Illuminate\Database\Eloquent\Builder|Limits 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 whereUpdated($value)
 * @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign whereUpdatedAt($value)
 * @property string|null $external_upload_at
 * @method static Builder|DictionaryCampaign whereExternalUploadAt($value)
 */
class DictionaryCampaign extends Pivot
{

    protected $table = 'dictionary_campaigns';

    protected $fillable = [
        'external_id',
        'campaign_id',
        'dictionary_id',
        'name',
        'negative_keywords',
        'excluded_sites',
        'updated',
        'external_upload_at',
    ];

    protected $casts = [
        'external_id' => 'int',
        'campaign_id' => 'int',
        'dictionary_id' => 'int',
        'negative_keywords' => 'array',
        'excluded_sites' => 'array',
        'updated' => 'boolean',
        'external_upload_at' => 'datetime',
    ];

    static public function getWithPivot()
    {
        return [
            'name',
            'external_upload_at',
            'negative_keywords',
            'excluded_sites',
            'updated',
        ];
    }

    static public function copyPropertyInCampaign(Campaigns $campaign)
    {
        return collect(self::getWithPivot())
            ->filter(function ($property_name){
                return $property_name !== 'updated' && $property_name !== 'external_upload_at';
            })
            ->transform(function ($property_name) use ($campaign) {
                return [
                    $property_name => $campaign->{$property_name}
                ];
            })->flatMap(function ($val){
                return $val;
            })->all();
    }

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

    public function scopeJoinDictionaries(Builder $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();
    }

}