Project.php 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. namespace App\Models;
  3. use App\Models\ProjectCate;
  4. use App\Models\ShopService;
  5. use App\Enums\ProjectStatus;
  6. use App\Models\CoachProject;
  7. use Illuminate\Database\Eloquent\SoftDeletes;
  8. use Slowlyo\OwlAdmin\Models\BaseModel as Model;
  9. /**
  10. * 项目服务
  11. */
  12. class Project extends Model
  13. {
  14. use SoftDeletes;
  15. protected $table = 'project';
  16. protected $guarded = [];
  17. /**
  18. * @Author FelixYin
  19. * @description 项目服务所属分类
  20. */
  21. public function cate()
  22. {
  23. return $this->belongsTo(ProjectCate::class, 'cate_id', 'id');
  24. }
  25. /**
  26. * @Author FelixYin
  27. * @description 项目服务关联店铺服务
  28. */
  29. public function shopServices()
  30. {
  31. return $this->hasMany(ShopService::class, 'service_id', 'id');
  32. }
  33. /**
  34. * 验证项目是否存在且状态正常
  35. *
  36. * @param int $projectId 项目ID
  37. * @param string|null $message 自定义错误消息
  38. * @return self 返回项目模型实例
  39. * @throws \Illuminate\Http\Exceptions\HttpResponseException 当项目不存在或状态异常时抛出异常
  40. */
  41. public static function validateOpenProject(int $projectId, ?string $message = null): self
  42. {
  43. $project = self::where('id', $projectId)
  44. ->where('state', ProjectStatus::OPEN->value)
  45. ->first();
  46. abort_if(!$project, 404, $message ?? '项目不存在或已下架');
  47. return $project;
  48. }
  49. /**
  50. * 格式化项目操作结果
  51. *
  52. * @param int $state 项目状态
  53. * @param string|null $stateText 状态描述文本
  54. * @return array 格式化后的操作结果,包含:
  55. * - project_id: int 项目ID
  56. * - project_name: string 项目名称
  57. * - state: int 项目状态
  58. * - state_text: string 状态描述
  59. */
  60. public function formatActionResult(int $state, ?string $stateText = null): array
  61. {
  62. return [
  63. 'project_id' => $this->id,
  64. 'project_name' => $this->title,
  65. 'state' => $state,
  66. 'state_text' => $stateText ?? ($state === ProjectStatus::OPEN->value ? '已开通' : '已关闭'),
  67. ];
  68. }
  69. /**
  70. * @Author FelixYin
  71. * @description 项目所属分类
  72. */
  73. public function category()
  74. {
  75. return $this->belongsTo(ProjectCate::class, 'category_id', 'id');
  76. }
  77. /**
  78. * @Author FelixYin
  79. * @description 项目关联技师
  80. */
  81. public function coachProjects()
  82. {
  83. return $this->hasMany(CoachProject::class, 'project_id', 'id');
  84. }
  85. }