Project.php 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. namespace App\Models;
  3. use App\Models\Enums\ProjectACL;
  4. use App\Models\Scopes\CompanyScope;
  5. use EloquentFilter\Filterable;
  6. use Illuminate\Database\Eloquent\Builder;
  7. use Illuminate\Database\Eloquent\Factories\HasFactory;
  8. use Illuminate\Database\Eloquent\Model;
  9. use Illuminate\Database\Eloquent\SoftDeletes;
  10. use Illuminate\Support\Facades\Auth;
  11. class Project extends Model
  12. {
  13. use HasFactory, Filterable,SoftDeletes;
  14. protected $fillable = [
  15. "name","code","const","status","begin","end","latitude","longitude","type","acl","whitelist","description"
  16. ];
  17. protected static function booted(): void
  18. {
  19. static::addGlobalScope(new CompanyScope);
  20. }
  21. /**
  22. * ACL 访问控制作用域
  23. *
  24. * @param Builder $query
  25. * @param string $id 单个操作时使用,限制范围
  26. * @return void
  27. */
  28. public function scopeAllowed(Builder $query, string $id = null): void
  29. {
  30. $projectIds = Project::query()->leftJoin("team_members", "projects.id", "=", "team_members.project_id")
  31. ->when($id == null, fn($query) => $query->filter(request()->query()))
  32. ->when($id, fn($query) => $query->where("projects.id", $id))
  33. ->where(function ($query) {
  34. $query->where("team_members.user_id", Auth::id())
  35. ->orWhere(fn($query) => $query->where("projects.acl", ProjectACL::CUSTOM->value)->where("whitelist", "like", "%,".Auth::id().",%"));
  36. })
  37. ->pluck("projects.id")
  38. ->unique();
  39. $query->whereIn("id", $projectIds->toArray());
  40. }
  41. public function plans(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
  42. {
  43. return $this->belongsToMany(Plan::class, 'project_plan');
  44. }
  45. public function assets(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
  46. {
  47. return $this->belongsToMany(Asset::class, 'project_asset');
  48. }
  49. public function requirements(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
  50. {
  51. return $this->belongsToMany(Requirement::class, 'project_requirement');
  52. }
  53. public function teamMembers(): \Illuminate\Database\Eloquent\Relations\HasMany
  54. {
  55. return $this->hasMany(TeamMember::class);
  56. }
  57. public function tasks(): \Illuminate\Database\Eloquent\Relations\HasMany
  58. {
  59. return $this->hasMany(Task::class);
  60. }
  61. public function requirementsGroup(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
  62. {
  63. return $this->belongsToMany(RequirementGroup::class, 'project_requirement');
  64. }
  65. public function library(){
  66. return $this->hasMany(Library::class ,'project_id')->where('type', 'project');
  67. }
  68. }