没有不值得去解决的问题,也没有不值得去学习的技术!

In Laravel 6’s Eloquent collection, adjust the nesting level of the API response structure

接口响应结构如下

1. The existing code is implemented as follows


$wpThemes = Theme::with('themeInstallation.themeInstallationVersionPreset.themeInstallationTasks')->withCount(['logs'])->orderBy('updated_at_gmt', 'desc')->get()->makeHidden('content');
return $wpThemes;


2. The interface response structure is as follows, as shown in Figure 1

接口响应结构如下
Figure 1

[
    {
        "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. It is expected to put some fields in the field Theme_Installation into the first level, that is, level with the ID, and finally delete the Theme_Installation.

4. The final implementation code is as follows


        $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. The final response structure is as follows, which is in line with expectations. as shown in Figure 2

最终的响应结构如下,符合预期
Figure 2

[
    {
        "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
    }
]


需要长期技术维护或远程问题排查?

我是拥有 15+ 年经验的 PHP / Go 后端工程师,长期关注已有系统维护、Bug 修复、性能优化、服务器排查、WordPress 网站维护和小功能迭代。

如果你的项目遇到以下情况,可以先从一次小问题排查开始合作:

  • ✅ PHP / Laravel / Yii2 老项目无人维护
  • ✅ Go / Gin 后端接口需要排查或优化
  • ✅ WordPress 网站访问慢、报错或插件冲突
  • ✅ Nginx / MySQL / Redis / Linux 服务器异常
  • ✅ CDN / Cloudflare / DNS / HTTPS 配置问题
  • ✅ 需要长期远程技术支持或兼职维护

更多介绍请查看:关于我 & 合作

微信:13980074657
邮箱:shuijingwanwq@gmail.com
Telegram:@shuijingwan
GitHub:https://github.com/shuijingwan

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理