'json', 'devices' => Separated::class, 'pages' => Separated::class, 'locale' => Separated::class, ]; public const UPDATED_AT = null; public static function boot() { parent::boot(); static::creating(function ($model) { $model->num = (int)$model->max('num') + 1; }); static::deleting(function ($model) { $model->regions()->delete(); $model->stat()->delete(); }); } /** * Banner position * @return \Illuminate\Database\Eloquent\Relations\hasOne */ public function position() { return $this->hasOne($this->modelClass('Position', 'Banners'), 'id', 'pos'); } /** * Banner regions * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function regions() { return $this->hasMany($this->modelClass('BannerRegions', 'Banners'), 'banner_id', 'id') ->with(['region' => function ($q) { $q->select(['id','title']); }]); } /** * Update regions * @param array $regions */ public function setRegionsAttribute($regions) { static::saved(function ($self) use ($regions) { /** @var $self self */ $before = $self->regions()->without('region')->get()->keyBy('region_id'); foreach ($regions as $id) { if ($id && $before->get($id)) { $before->forget($id); } else { $region = Geo::regionParents($id); if (! empty($region['db']['geo_region1'])) { $region['db']['region_id'] = $id; $self->regions()->create($region['db']); } } } foreach ($before as $deleted) { $deleted->delete(); } }); } /** * Banner statistic * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function stat() { return $this->hasMany($this->modelClass('BannerStat', 'Banners'), 'banner_id', 'id'); } /** * Statistic increment * @param string $field * @param string|null $date */ protected function statIncrement($field, $date = null) { if ($this->exists) { if (is_null($date)) { $date = date('Y-m-d'); } if (! $this->stat()->where('period', $date)->increment($field, 1)) { $this->stat()->create(['period' => $date, $field => 1]); } } } /** * Increment banner shows * @param string|null $date */ public function showed($date = null) { $this->statIncrement('shows', $date); } /** * Increment banner clicks * @param string|bool|null $date */ public function clicked($date = null) { $this->statIncrement('clicks', $date); } }