RequirementFilter.php 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. namespace App\ModelFilters;
  3. use App\Models\Asset;
  4. use App\Models\Requirement;
  5. use App\Models\RequirementGroup;
  6. use EloquentFilter\ModelFilter;
  7. class RequirementFilter extends ModelFilter
  8. {
  9. /**
  10. * Related Models that have ModelFilters as well as the method on the ModelFilter
  11. * As [relationMethod => [input_key1, input_key2]].
  12. *
  13. * @var array
  14. */
  15. public $relations = [];
  16. public function apply($query)
  17. {
  18. return $query;
  19. }
  20. public function plan($plan_id){
  21. return $this->where('plan_id',$plan_id);
  22. }
  23. public function assetId($assetId){
  24. $asset = Asset::find($assetId);
  25. if (!$asset || !$asset->children()->first()) {
  26. // 如果没有子级,只返回该分组的需求
  27. return $this->where('asset_id', $assetId);
  28. }
  29. $allRelatedIds = $this->getAllRelatedIds($assetId);
  30. array_push($allRelatedIds, $asset->id);
  31. //把父级id去重
  32. $unIds=array_unique($allRelatedIds);
  33. return $this->whereIn('asset_id',$unIds);
  34. }
  35. //递归获取资产
  36. private function getAllRelatedIds($assetId)
  37. {
  38. $asset = Asset::find($assetId);
  39. if (!$asset) {
  40. return [];
  41. }
  42. // 获取所有子级ID
  43. $childIds = $asset->children()->pluck('id')->toArray();
  44. // 递归获取所有子级的子级ID
  45. foreach ($childIds as $childId) {
  46. $childIds = array_merge($childIds, $this->getAllRelatedIds($childId));
  47. }
  48. return $childIds;
  49. }
  50. public function group($groupId){
  51. if($groupId==0){
  52. return $this->whereNull('requirement_group_id');
  53. }
  54. //
  55. $group = RequirementGroup::find($groupId);
  56. if (!$group || !$group->children()->first()) {
  57. // 如果没有子级,只返回该分组的需求
  58. return $this->where('requirement_group_id', $groupId);
  59. }
  60. $allRelatedGroupIds = $this->getAllGroupRelatedIds($groupId);
  61. //把父级id去重
  62. $unIds=array_unique($allRelatedGroupIds);
  63. return $this->whereIn('requirement_group_id',$unIds);
  64. }
  65. //递归获取需求分组
  66. private function getAllGroupRelatedIds($groupId)
  67. {
  68. $group = RequirementGroup::find($groupId);
  69. if (!$group) {
  70. return [];
  71. }
  72. // 获取所有子级ID
  73. $childIds = $group->children()->pluck('id')->toArray();
  74. // 递归获取所有子级的子级ID
  75. foreach ($childIds as $childId) {
  76. $childIds = array_merge($childIds, $this->getAllGroupRelatedIds($childId));
  77. }
  78. // 添加父级ID(如果需要的话)
  79. if ($group->parent_id) {
  80. $childIds[] = $group->parent_id;
  81. }
  82. return $childIds;
  83. }
  84. }