<?php namespace App\Models; use App\Models\Enums\AssetACL; use App\Models\Scopes\CompanyScope; use EloquentFilter\Filterable; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Auth; /** * @method static \Illuminate\Database\Eloquent\Builder allowed() */ class Asset extends Model { use HasFactory, Filterable; protected $fillable = [ "name", "code", "description", "company_id", "status", "created_by", "owner", "address", "group_id", "geo_address_code", "acl", "whitelist", "latitude", "longitude","parent_id", "path", "equity_interest","developer","date_completed","total_floor_area","contact_person","contact_phone","contact_email","property","building_type_description" ]; protected static function booted(): void { static::addGlobalScope(new CompanyScope); } public function scopeAllowed(Builder $query): void { $query->where(function (Builder $query) { return $query->where('acl', AssetACL::PRIVATE->value)->where('owner', Auth::id()); })->orWhere(function (Builder $query) { return $query->where('acl', AssetACL::CUSTOM->value)->where('whitelist', 'like', '%,' . Auth::id() . ',%'); }); } public function children(){ return $this->hasMany(Asset::class ,'parent_id'); } public function parent(){ return $this->belongsTo(Asset::class ,'parent_id'); } public function requirementGroups(){ return $this->hasMany(RequirementGroup::class ,'asset_id'); } public function requirements(){ return $this->hasMany(Requirement::class ,'asset_id'); } public function plans(){ return $this->hasMany(Plan::class ,'asset_id'); } public function projects(){ return $this->belongsToMany(Project::class,'project_asset'); } //获取子级需求数量 public function getTotalRequirementsCountAttribute() { $totalRequirementsCount = $this->requirements()->count(); // 当前资产的需求数量 foreach ($this->children as $child) { $totalRequirementsCount += $child->getTotalRequirementsCountAttribute(); // 递归调用子资产的方法 } return $totalRequirementsCount; } //获取子级计划数量 public function getTotalPlansCountAttribute() { $totalPlansCount = $this->plans()->count(); // 当前资产的需求数量 foreach ($this->children as $child) { $totalPlansCount += $child->getTotalPlansCountAttribute(); // 递归调用子资产的方法 } return $totalPlansCount; } }