93 lines
2.5 KiB
PHP
93 lines
2.5 KiB
PHP
<?php
|
|
|
|
namespace kernel\app_modules\view\models;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use kernel\app_modules\view\interfaces\Viewable;
|
|
use kernel\modules\user\models\User;
|
|
|
|
// Добавить @property
|
|
/**
|
|
* @property int $id
|
|
* @property int $status
|
|
*/
|
|
class View extends Model
|
|
{
|
|
const DISABLE_STATUS = 0;
|
|
const ACTIVE_STATUS = 1;
|
|
|
|
protected $table = 'view';
|
|
|
|
protected $fillable = [
|
|
'user_id',
|
|
'ip_address',
|
|
'user_agent',
|
|
];
|
|
|
|
/**
|
|
* Получить родительскую модель (пост, комментарий, файл и т.д.)
|
|
*/
|
|
public function viewable(): \Illuminate\Database\Eloquent\Relations\MorphTo
|
|
{
|
|
return $this->morphTo();
|
|
}
|
|
|
|
/**
|
|
* Пользователь, который просмотрел
|
|
*/
|
|
public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo
|
|
{
|
|
return $this->belongsTo(User::class);
|
|
}
|
|
|
|
/**
|
|
* Увеличить счетчик просмотров для модели
|
|
*/
|
|
public static function track(Viewable $viewable)
|
|
{
|
|
// Проверяем, не просматривал ли уже пользователь этот элемент
|
|
//$existingView = static::forViewable($viewable)->first();
|
|
|
|
// if (!$existingView) {
|
|
// return static::create([
|
|
// 'user_id' => null,
|
|
// 'viewable_id' => $viewable->id,
|
|
// 'viewable_type' => get_class($viewable),
|
|
// ]);
|
|
// }
|
|
|
|
return static::create([
|
|
'user_id' => null,
|
|
'viewable_id' => $viewable->id,
|
|
'viewable_type' => get_class($viewable),
|
|
]);
|
|
|
|
//return $existingView;
|
|
}
|
|
|
|
/**
|
|
* Scope для поиска просмотров определенной модели
|
|
*/
|
|
public function scopeForViewable($query, Viewable $viewable)
|
|
{
|
|
return $query->where('viewable_id', $viewable->id)
|
|
->where('viewable_type', get_class($viewable))
|
|
->when(auth()->check(), function ($q) {
|
|
$q->where('user_id', auth()->id());
|
|
}, function ($q) {
|
|
$q->where('ip_address', request()->ip());
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @return string[]
|
|
*/
|
|
public static function getStatus(): array
|
|
{
|
|
return [
|
|
self::DISABLE_STATUS => "Не активный",
|
|
self::ACTIVE_STATUS => "Активный",
|
|
];
|
|
}
|
|
|
|
} |