使用 include 机制,如果 include 参数返回时数组的话,如何去掉 data 层?

使用 include 机制,如果 include 参数返回时单个 item 的时候是可以使用 ArraySerializer 减少 data 层,但是如果参数返回 collection 的话,如何去掉 data 层?
路由:

//获取单个拼音和字列表
        $api->get('pinyins/{pinyin}','PinyinsController@show')->name('api.pinyins.show');

控制器:

public function show(Pinyin $pinyin)
    {
        return $this->response->item($pinyin,new PinyinTransformer());
    }

transformer:

public function includeZitis(Pinyin $pinyin)
    {
        return $this->collection($pinyin->zitis,new ZitiTransformer());
    }

请求:

http://hanzi.test/api/pinyins/1?include=zitis

返回数据:

{
    "id": 1,
    "name": "a",
    "zimu_id": 1,
    "zitis": {
        "data": [
            {
                "id": 1,
                "zi": "阿",
                "duyin": "ā",
                "img": ""
            },
            {
                "id": 2,
                "zi": "啊",
                "duyin": "ā",
                "img": ""
            },
            {
                "id": 3,
                "zi": "腌",
                "duyin": "ā",
                "img": ""
            },
            {
                "id": 4,
                "zi": "吖",
                "duyin": "ā",
                "img": ""
            },
            {
                "id": 5,
                "zi": "锕",
                "duyin": "ā",
                "img": ""
            },
            {
                "id": 6,
                "zi": "錒",
                "duyin": "ā",
                "img": ""
            },
            {
                "id": 7,
                "zi": "B",
                "duyin": "ā",
                "img": "https://ii.911cha.com/zidian/song48/154/25969.png"
            },
            {
                "id": 8,
                "zi": "B",
                "duyin": "ā",
                "img": "https://ii.911cha.com/zidian/song48/135/20f1e.png"
            },
            {
                "id": 9,
                "zi": "B",
                "duyin": "ā",
                "img": "https://ii.911cha.com/zidian/song48/165/2825a.png"
            },
            {
                "id": 10,
                "zi": "嗄",
                "duyin": "á",
                "img": ""
            },
            {
                "id": 11,
                "zi": "呵",
                "duyin": "a",
                "img": ""
            }
        ]
    }
}
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1

dingo/api的文档提供了 Serializers, 用于重写数据包裹,可以根据 collection , item 分别定制

<?php

namespace App\Serializers;

use League\Fractal\Serializer\ArraySerializer;

class CustomSerializer extends ArraySerializer
{
//    /**
//     * Serialize a collection.
//     */
//    public function collection($resourceKey, array $data)
//    {
//        return [$resourceKey ?: 'result' => $data];
//    }

    /**
     * Serialize an item.
     */
    public function item($resourceKey, array $data)
    {
        return ($resourceKey) ? [$resourceKey => $data] : $data;
    }
}

也可以试试 weiwenhao/tree-ql 这个扩展,愉快的 include 没有 data 嵌套 ,不用每个 include 都定义回调,不会有 n + 1 问题 :flushed:

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!