46 lines
1.2 KiB
PHP
46 lines
1.2 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Traits;
|
||
|
|
|
||
|
|
//use App\Models\Previewer;
|
||
|
|
use App\Contracts\Previewable;
|
||
|
|
use App\Models\Preview;
|
||
|
|
use Illuminate\Database\Eloquent\Relations\MorphMany;
|
||
|
|
|
||
|
|
trait CanPreview
|
||
|
|
{
|
||
|
|
//通用访客功能
|
||
|
|
public function preview(Previewable $previewable):preview
|
||
|
|
{
|
||
|
|
$arr = [
|
||
|
|
'previewed_id' => $this->primaryId(),
|
||
|
|
'previewed_type' => get_class(),
|
||
|
|
];
|
||
|
|
$result = $this->hasPreviewed($previewable);
|
||
|
|
if ($result) {
|
||
|
|
$preview = $previewable->previews()->where($arr)->first();
|
||
|
|
$preview->increment('num', 1);
|
||
|
|
}else {
|
||
|
|
$preview = new Preview($arr);
|
||
|
|
$previewable->previews()->save($preview);
|
||
|
|
}
|
||
|
|
return $preview;
|
||
|
|
}
|
||
|
|
|
||
|
|
public function hasPreviewed(Previewable $previewable):bool
|
||
|
|
{
|
||
|
|
$preview = [
|
||
|
|
'previewed_id' => $this->primaryId(),
|
||
|
|
'previewed_type' => get_class(),
|
||
|
|
];
|
||
|
|
$result = $previewable->previews()->where($preview)->count();
|
||
|
|
return $result;
|
||
|
|
}
|
||
|
|
|
||
|
|
//用户访问列表(所有服务)
|
||
|
|
public function previews(): MorphMany
|
||
|
|
{
|
||
|
|
return $this->morphMany(Preview::class);
|
||
|
|
}
|
||
|
|
}
|