| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- <?php
- namespace App\Models;
- /*
- * Service — услуга компании.
- * Таблица: services
- * Slug генерируется из title при создании, уникален.
- * tags хранятся как JSON-массив строк.
- */
- use Illuminate\Database\Eloquent\Builder;
- use Illuminate\Database\Eloquent\Model;
- use Illuminate\Support\Str;
- class Service extends Model
- {
- protected $fillable = [
- 'title', 'slug', 'icon', 'excerpt', 'description', 'tags', 'sort_order', 'is_active',
- ];
- protected $casts = [
- 'tags' => 'array',
- 'is_active' => 'boolean',
- ];
- // Генерирует уникальный slug из заголовка
- public static function generateSlug(string $title, ?int $exceptId = null): string
- {
- $base = Str::slug($title);
- $slug = $base;
- $i = 1;
- while (
- static::where('slug', $slug)
- ->when($exceptId, fn (Builder $q) => $q->where('id', '!=', $exceptId))
- ->exists()
- ) {
- $slug = $base . '-' . $i++;
- }
- return $slug;
- }
- // Scope: только активные услуги
- public function scopeActive(Builder $query): Builder
- {
- return $query->where('is_active', true);
- }
- }
|