Browse Source

通过资产id查询出所有有关的项目(包括其子资产-通过中间表)

langshiyeye 1 year ago
parent
commit
c943f2de1a

+ 8 - 2
app/Http/Controllers/API/ProjectController.php

@@ -8,11 +8,13 @@ use App\Http\Requests\API\Project\LinkRequirementByPlanRequest;
 use App\Http\Requests\API\Project\LinkRequirementRequest;
 use App\Http\Requests\API\Project\PostponeRequest;
 use App\Http\Requests\API\Project\UnlinkRequirementRequest;
+use App\Http\Resources\API\ProjectAssetResource;
 use App\Http\Resources\API\ProjectDetailResource;
 use App\Http\Resources\API\SimplePlanResource;
 use App\Http\Resources\API\ProjectRequirementResource;
 use App\Http\Resources\API\ProjectResource;
 use App\Http\Resources\API\RequirementResource;
+use App\Models\Asset;
 use App\Models\Enums\ProjectStatus;
 use App\Models\Plan;
 use App\Models\Project;
@@ -30,9 +32,13 @@ class ProjectController extends Controller
      */
     public function index(Request $request)
     {
-        $projects = Project::filter($request->all())->get();
 
-        return ProjectResource::collection($projects);
+        $projectAsset = ProjectAsset::filter($request->all())->simplePaginate();
+        foreach ($projectAsset as $item){
+                $item->project = Project::find($item->project_id);
+                $item->asset = Asset::find($item->asset_id);
+        }
+        return ProjectAssetResource::collection($projectAsset);
     }
 
     /**

+ 23 - 0
app/Http/Resources/API/ProjectAssetResource.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Http\Resources\API;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class ProjectAssetResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return [
+            'id' => $this->id,
+            'project' => $this->project,
+            'asset' => new AssetParentResource($this->asset),
+        ];
+    }
+}

+ 1 - 1
app/Http/Resources/API/ProjectResource.php

@@ -23,7 +23,7 @@ class ProjectResource extends JsonResource
             'begin' => $this->begin,
             'end' => $this->end,
             'available_days' => $this->available_days,
-            'asset' => new AssetParentResource($this->assets[0]),
+            'asset' => new AssetParentResource($this->asset),
         ];
     }
 }

+ 31 - 0
app/ModelFilters/ProjectAssetFilter.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace App\ModelFilters;
+
+use App\Models\Asset;
+use App\Models\ProjectAsset;
+use EloquentFilter\ModelFilter;
+
+class ProjectAssetFilter extends ModelFilter
+{
+    /**
+    * Related Models that have ModelFilters as well as the method on the ModelFilter
+    * As [relationMethod => [input_key1, input_key2]].
+    *
+    * @var array
+    */
+    public $relations = [];
+    public function apply($query)
+    {
+        return $query;
+    }
+    public function assetId($assetId){
+
+        $asset = Asset::find($assetId);
+        $assetIds=[];
+        if ($asset){
+            $assetIds = Asset::where('path','like',"%{$asset->path}%")->get('id');
+        }
+        return $this->whereIn('asset_id',$assetIds);
+    }
+}

+ 0 - 37
app/ModelFilters/ProjectFilter.php

@@ -15,41 +15,4 @@ class ProjectFilter extends ModelFilter
     * @var array
     */
     public $relations = [];
-    public function assetId($assetId){
-        $projectIds =[];
-        $asset = Asset::find($assetId);
-        if (!$asset ) {
-            // 如果没有资产,给id赋值空数组
-            return $this->whereIn('id', $projectIds);
-        }elseif (!$asset->children()->first()){
-            //如果不存在子资产,则id只为原资产id
-            $projectAsset = ProjectAsset::where('asset_id',$assetId)->select('project_id')->get();
-            return $this->whereIn('id', $projectAsset);
-        }
-        $allRelatedIds = $this->getAllRelatedIds($assetId);
-        array_push($allRelatedIds, $asset->id);
-        //把父级id去重
-        $unIds=array_unique($allRelatedIds);
-        $projectAsset = ProjectAsset::whereIn('asset_id',$unIds)->select('project_id')->get();
-        $projectIds=$projectAsset;
-        return $this->whereIn('id',$projectIds);
-    }
-
-    private function getAllRelatedIds($assetId)
-    {
-        $asset = Asset::find($assetId);
-
-        if (!$asset) {
-            return [];
-        }
-
-        // 获取所有子级ID
-        $childIds = $asset->children()->pluck('id')->toArray();
-        // 递归获取所有子级的子级ID
-        foreach ($childIds as $childId) {
-            $childIds = array_merge($childIds, $this->getAllRelatedIds($childId));
-        }
-
-        return $childIds;
-    }
 }

+ 2 - 1
app/Models/ProjectAsset.php

@@ -2,12 +2,13 @@
 
 namespace App\Models;
 
+use EloquentFilter\Filterable;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 
 class ProjectAsset extends Model
 {
-    use HasFactory;
+    use HasFactory,Filterable;
 
     protected $table = 'project_asset';