在 Laravel 6 的 Eloquent 集合中,调整 API 响应结构的嵌套层级
1、现有的代码实现如下
1 2 | $wpThemes = Theme::with( 'themeInstallation.themeInstallationVersionPreset.themeInstallationTasks' )->withCount([ 'logs' ])->orderBy( 'updated_at_gmt' , 'desc' )->get()->makeHidden( 'content' ); return $wpThemes ; |
2、接口响应结构如下,如图1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | [ { "id": 104, "custom_name": "xxx", "name": "xxx", "is_original": false, "is_default": false, "created_at_gmt": "2022-05-27 01:43:18", "updated_at_gmt": "2022-05-27 01:43:18", "original_theme_name": "default", "logs_count": 0, "created_at": "2022-05-27 09:43:18", "updated_at": "2022-05-27 09:43:18", "cover_url": "https:\/\/xxx-s3.s3.us-east-2.amazonaws.com\/defaults\/xxx.jpg", "alias": "xxx", "architecture": "2.0", "is_fission": false, "theme_installation": { "id": 2, "theme_store_theme_id": 9, "theme_id": "96653e3a-9f95-44dd-ade9-d928a59d0332", "wp_theme_id": 104, "theme_name": "xxx", "theme_custom_name": "xxx", "role": "unpublished", "processing": 0, "processing_failed": 1, "created_at": "2022-05-27 09:43:18", "updated_at": "2022-05-27 09:43:22", "theme_installation_version_preset": { "id": 2, "theme_installation_id": 2, "theme_store_theme_id": 9, "theme_store_theme_version_id": 1, "theme_store_theme_version_preset_id": 1, "theme_store_theme_version_preset_zip_url": "https:\/\/xxx.s3.xxx.amazonaws.com\/xxx\/xxx.zip", "update_state": "manual_update", "processing": 0, "processing_failed": 1, "created_at": "2022-05-27 09:43:18", "updated_at": "2022-05-27 09:43:22", "theme_installation_tasks": [ { "id": 2, "theme_installation_id": 2, "theme_installation_version_preset_id": 2, "processing": 0, "processing_failed": 1, "step": 4, "failed_message": "file_get_contents(E:\\wwwroot\\xxx\\platform\\storage\\app\/theme_downloads\/2022\/05\/27\/1653615799.0006.1605685643\\.themeignore): failed to open stream: No such file or directory", "created_at": "2022-05-27 09:43:18", "updated_at": "2022-05-27 09:43:22" } ] } } } ] |
3、期望将字段 theme_installation 中的一些字段放入第一级中,即与 id 平级,最后删除掉 theme_installation。
4、最终实现代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $wpThemes = Theme::with( 'themeInstallation.themeInstallationVersionPreset.themeInstallationTasks' )->withCount([ 'logs' ])->orderBy( 'updated_at_gmt' , 'desc' )->get()->makeHidden( 'content' ); $themes = []; foreach ( $wpThemes as $wpTheme ) { $wpTheme [ 'role' ] = $wpTheme ->themeInstallation[ 'role' ] ?? ThemeInstallation::ROLE_UNPUBLISHED; $wpTheme [ 'processing' ] = $wpTheme ->themeInstallation[ 'processing' ] ?? ThemeInstallation::PROCESSING_FALSE; $wpTheme [ 'processing_failed' ] = $wpTheme ->themeInstallation[ 'processing_failed' ] ?? ThemeInstallation::PROCESSING_FAILED_FALSE; $wpTheme [ 'theme_store_theme_id' ] = $wpTheme ->themeInstallation[ 'theme_store_theme_id' ] ?? 0; $wpTheme [ 'theme_id' ] = $wpTheme ->themeInstallation[ 'theme_id' ] ?? '' ; $wpTheme [ 'installation_task_id' ] = $wpTheme ->themeInstallation->themeInstallationVersionPreset->themeInstallationTasks[0][ 'id' ] ?? 0; $wpTheme [ 'installation_task_failed_message' ] = $wpTheme ->themeInstallation->themeInstallationVersionPreset->themeInstallationTasks[0][ 'failed_message' ] ?? '' ; unset( $wpTheme ->themeInstallation); $themes [] = $wpTheme ; } return $themes ; |
5、最终的响应结构如下,符合预期。如图2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | [ { "id": 104, "custom_name": "xxx", "name": "xxx", "is_original": false, "is_default": false, "created_at_gmt": "2022-05-27 01:43:18", "updated_at_gmt": "2022-05-27 01:43:18", "original_theme_name": "default", "logs_count": 0, "role": "unpublished", "processing": 0, "processing_failed": 1, "theme_store_theme_id": 9, "theme_id": "96653e3a-9f95-44dd-ade9-d928a59d0332", "installation_task_id": 2, "installation_task_failed_message": "file_get_contents(E:\\wwwroot\\xxx\\platform\\storage\\app\/theme_downloads\/2022\/05\/27\/1653615799.0006.1605685643\\.themeignore): failed to open stream: No such file or directory", "created_at": "2022-05-27 09:43:18", "updated_at": "2022-05-27 09:43:18", "cover_url": "https:\/\/xxx-s3.s3.us-east-2.amazonaws.com\/defaults\/xxx.jpg", "alias": "xxx", "architecture": "2.0", "is_fission": false } ] |
近期评论