0

我正在尝试将给定的 API 响应转换为易于使用的东西。

这是我到目前为止所拥有的:

控制器:

public function drive()
{
    $optParams = [
        'corpora' => 'drive',
        'driveId' => env('GOOGLE_DRIVE_ID'),
        'includeItemsFromAllDrives' => true,
        'supportsAllDrives' => true,
        'fields' => 'files(*)'
    ];

    $results = $this->googleDrive->files->listFiles($optParams);
    $data = collect($results);
    $collection = new FileCollection($data);
    dd($collection);

    return 'Hi!';
}

文件收集资源:

public function toArray($request)
{
    return [
        'data' => $this->collection,
        'meta' => ['files_count' => $this->collection->count()],
    ];
}

文件资源:

public function toArray($request)
{
    return [
        'name' => $this->resource['name'],
        'mime' => $this->resource['mimeType'],
        'parents' => $this->resource['parents'],
        'version' => $this->resource['version'],
        'webDownloadLink' => $this->resource['webContentLink'],
        'webLink' => $this->resource['webViewLink'],
        'modified_at' => $this->resource['modifiedTime'],
        'size' => $this->resource['size']
    ];
}

这是我得到的结果:

FileCollection {#223 ▼
  +collects: null
  +collection: Collection {#243 ▶}
  +resource: Collection {#243 ▼
    #items: array:2 [▼
      0 => File {#224 ▼
        +resource: Google_Service_Drive_DriveFile {#279 ▶}
        +with: []
        +additional: []
      }
      1 => File {#263 ▼
        +resource: Google_Service_Drive_DriveFile {#269 ▶}
        +with: []
        +additional: []
      }
    ]
  }
  +with: []
  +additional: []
}

因此,您可以看到资源类型是正确的,但由于某种原因,FileCollection 中的“不存在,File资源中的字段也不存在。仍然显示所有字段,例如 30+(而不是 FileResource 中请求的 8 个)。

我在这里错过了什么吗?


编辑:

当使用 toArray() 方法 ( $collection->toArray(null)) 访问集合时,我确实得到了适当的结果:

array:2 [▼
  "data" => Collection {#243 ▼
    #items: array:2 [▼
      0 => File {#224 ▶}
      1 => File {#263 ▶}
    ]
  }
  "meta" => array:1 [▼
    "files_count" => 2
  ]
]

那么我现在如何确保这个集合使用 FileResources 的 toArray() 呢?(我仍然得到超过 30 个字段,而不是 8 个)。

PS:我真的不明白为什么我需要调用 toArray(),在他们的文档中没有任何地方写:https ://laravel.com/docs/5.8/eloquent-resources 。

4

0 回答 0