Submission.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Database\Eloquent\Factories\HasFactory;
  4. use Illuminate\Database\Eloquent\Model;
  5. use Illuminate\Database\Eloquent\SoftDeletes;
  6. use Illuminate\Database\Eloquent\Builder;
  7. class Submission extends Model
  8. {
  9. use HasFactory, SoftDeletes;
  10. protected $fillable = [
  11. 'name',
  12. 'email',
  13. 'message',
  14. 'ip_address',
  15. 'status',
  16. ];
  17. protected $casts = [
  18. 'created_at' => 'datetime',
  19. 'updated_at' => 'datetime',
  20. 'deleted_at' => 'datetime',
  21. ];
  22. // Связь один-ко-многим: у заявки могут быть комментарии
  23. public function comments()
  24. {
  25. return $this->hasMany(Comment::class);
  26. }
  27. // Связь многие-ко-многим: заявка может иметь несколько тегов
  28. public function tags()
  29. {
  30. return $this->belongsToMany(Tag::class, 'submission_tag');
  31. }
  32. // Полиморфная связь: заявка может иметь вложения
  33. public function attachments()
  34. {
  35. return $this->morphMany(Attachment::class, 'attachable');
  36. }
  37. // Query Scope: только активные заявки
  38. public function scopeActive(Builder $query)
  39. {
  40. return $query->where('status', 'active');
  41. }
  42. // Query Scope: только архивные заявки
  43. public function scopeArchived(Builder $query)
  44. {
  45. return $query->where('status', 'archived');
  46. }
  47. // Query Scope: поиск по имени или email
  48. public function scopeSearch(Builder $query, $search)
  49. {
  50. return $query->where(function ($q) use ($search) {
  51. $q->where('name', 'like', "%{$search}%")
  52. ->orWhere('email', 'like', "%{$search}%");
  53. });
  54. }
  55. // Query Scope: недавние заявки (за последние N дней)
  56. public function scopeRecent(Builder $query, $days = 7)
  57. {
  58. return $query->where('created_at', '>=', now()->subDays($days));
  59. }
  60. }