具有一对多关系的vapor3 JSON响应

时间:2018-11-27 06:05:45

标签: swift postgresql server vapor

我是iOS开发人员,是Vapor3和Fluent-ORM框架的初学者。

我想使用3个不同的子类获取响应JSON。

实际上我做到了,但是我确定这不是一个好方法,它只是反复使用map函数。

有人知道更好的获取JSON的方法吗?

我期望得到的JSON响应如下,

    "id": 2,
    "friends": [
        {
            "id": 2,
            "name": "h1ah",
            "userID": 2
        }
    ],
    "enemys": [
        {
            "id": 1,
            "name": "dragon",
            "userID": 2
        }
    ],
    "name": "HI",
    "pokemons": [
        {
            "id": 11,
            "level": 1,
            "name": "pokemon",
            "userID": 2
        },
        {
            "id": 12,
            "level": 1,
            "name": "pokem1on",
            "userID": 2
        },
        {
            "id": 14,
            "level": 1,
            "name": "pokem1on",
            "userID": 2
        }
    ],
    "items": []

下面是我的代码。

func getA(_ req:Request) throws -> Future<[UserWithPokomon]> {

    return User.query(on: req).sort(\.id, .ascending).all().flatMap({ users in

        let futures = try users.map({ user in
            try user.pokemons.query(on: req).all().map({ pokemons in
                try user.friends.query(on: req).all().map({ friend in
                    try user.enemys.query(on: req).all().map({ enemies in
                        try user.items.query(on: req).all().map({ items in                         
                            return  UserWithPokomon.init(id: user.id!, name: user.username, pokemons: pokemons, friends:friend, enemys:enemies, items:items)
                        })
                    })
                })
            })
        })

        let aaaa = futures.compactMap({ oo in    
            return oo.flatMap({ pp in      
                return pp.flatMap({                        
                    return $0.flatMap( { aa in
                        return aa
                    })
                })

            })

        })

        return aaaa.flatten(on: req)            
    })
}

0 个答案:

没有答案