Service.php 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. <?php
  2. namespace App\Models;
  3. /*
  4. * Service — услуга компании.
  5. * Таблица: services
  6. * Slug генерируется из title при создании, уникален.
  7. * tags хранятся как JSON-массив строк.
  8. */
  9. use Illuminate\Database\Eloquent\Builder;
  10. use Illuminate\Database\Eloquent\Model;
  11. use Illuminate\Support\Str;
  12. class Service extends Model
  13. {
  14. protected $fillable = [
  15. 'title', 'slug', 'icon', 'excerpt', 'description', 'tags', 'sort_order', 'is_active',
  16. ];
  17. protected $casts = [
  18. 'tags' => 'array',
  19. 'is_active' => 'boolean',
  20. ];
  21. // Генерирует уникальный slug из заголовка
  22. public static function generateSlug(string $title, ?int $exceptId = null): string
  23. {
  24. $base = Str::slug($title);
  25. $slug = $base;
  26. $i = 1;
  27. while (
  28. static::where('slug', $slug)
  29. ->when($exceptId, fn (Builder $q) => $q->where('id', '!=', $exceptId))
  30. ->exists()
  31. ) {
  32. $slug = $base . '-' . $i++;
  33. }
  34. return $slug;
  35. }
  36. // Scope: только активные услуги
  37. public function scopeActive(Builder $query): Builder
  38. {
  39. return $query->where('is_active', true);
  40. }
  41. }