-
Notifications
You must be signed in to change notification settings - Fork 61
/
UseSlug.php
77 lines (63 loc) · 1.71 KB
/
UseSlug.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
namespace Juzaweb\CMS\Traits;
use Illuminate\Support\Str;
trait UseSlug
{
public static function bootUseSlug(): void
{
static::saving(
function ($model) {
if (empty($model->slug)) {
$model->slug = $model->generateSlug();
}
}
);
}
public static function findBySlug($slug, $column = []): self
{
return self::query()
->where('slug', '=', $slug)
->first($column);
}
public static function findBySlugOrFail($slug): self
{
return self::query()
->where('slug', '=', $slug)
->firstOrFail();
}
public function getDisplayName()
{
if (empty($this->fieldName)) {
return $this->name ?: $this->title;
}
return $this->{$this->fieldName};
}
public function generateSlug($string = null): string
{
if (empty($string)) {
if ($slug = request()->input('slug')) {
$string = $slug;
} elseif (isset($this->slug)) {
$string = $this->slug;
} else {
$string = $this->getDisplayName();
}
}
$baseSlug = sub_char($string, 70, '');
$baseSlug = Str::slug($baseSlug);
$i = 1;
$slug = $baseSlug;
do {
$row = self::where('id', '!=', $this->id)
->where('slug', '=', $slug)
->orderBy('slug', 'DESC')
->first(['slug']);
if ($row) {
$slug = $baseSlug . '-' . $i;
}
$i++;
} while ($row);
$this->slug = $slug;
return $slug;
}
}