Files
svo/kernel/app_modules/view/models/View.php
2025-07-20 15:02:06 +03:00

93 lines
2.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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 => "Активный",
];
}
}