【Vapor】07 Chapter 9: Parent-Child Relationships

0x00 Chapter 9: Parent-Child Relationships

1.Parent-child relationships describe a relationship where one model has “ownership” of one or more models.
They are also known as one-to-one and one-to-many relationships.


2.In the TIL application, users will create acronyms.
Users (the parent) can have many acronyms, and an acronym (the child) can only be created by one user.


3.Creating a user
create User.swift in Sources/App/Models
create CreateUser.swift in Sources/App/Migrations
create UsersController.swift in Sources/App/Controllers

用户数据模型:User.swift

import Vapor
import Fluent

final class User: Model, Content {
    // 数据库中的表名
    static let schema = "users"
    
    // id 字段
    @ID
    var id: UUID?
    
    // name 字段    
    @Field(key: "name")
    var name: String
    
    // username 字段
    @Field(key: "username")
    var username: String
    
    init() {}
    
    init(id: UUID? = nil, name: String, username: String) {
        self.name = name
        self.username = name
    }
}

用户数据表创建: CreateUser.swift

import Fluent

struct CreateUser: Migration {
    func prepare(on database: Database) -> EventLoopFuture<Void>{
        database.schema("users")
            .id()
            .field("name", .string, .required)
            .field("username", .string, .required)
            .create()
    }
    
    func revert(on database: Database) -> EventLoopFuture<Void>{
        database.schema("users").delete()
    }
}

Finally, open configure.swift to add CreateUser to the migration list.
Insert the following after app.migrations.add(CreateAcronym()):

app.migrations.add(CreateUser())

4.User controller
UsersController.swift

import Fluent
import Vapor

struct UsersController: RouteCollection {
    func boot(routes: RoutesBuilder) throws {
    	// 路由组
        let usersRoute = routes.grouped("api", "users")
        // 路由
        usersRoute.post(use: createHandler)
        usersRoute.get(use: getAllHandler)
        usersRoute.get(":userID", use: getHandler)
    }
    
    // 创建用户
    func createHandler(_ req: Request) throws -> EventLoopFuture<User> {
        let user = try req.content.decode(User.self)
        return user.save(on: req.db).map { user }
    }
    
    // 查询所有用户
    func getAllHandler(_ req: Request) throws -> EventLoopFuture<[User]> {
        User.query(on: req.db).all()
    }
    
    // 根据 ID 查询用户
    // http://127.0.0.1:8080/api/users/<ID>
    func getHandler(_ req: Request) throws -> EventLoopFuture<User> {
        User.find(req.parameters.get("userID"), on: req.db)
            .unwrap(or: Abort(.notFound))
    }
}

open routes.swift and add the following to the end of routes(_:)

try app.register(collection: UsersController())

5.测试接口
以上文件的创建,与 Acronym 类似
标准三件套:

XXX.swift
CreateXXX.swift
XXXsController.swift

XXX 是具体的数据模型
CreateXXX 用于创建数据表
XXXsController 用于处理路由事件

a.创建用户
需要提交数据
url: http://127.0.0.1:8080/api/users
method: POST
parameters: {"name": "老五", "username":"王五"}

请添加图片描述


b.查询所有用户

url: http://127.0.0.1:8080/api/users
method: GET
parameters:

直接在浏览器访问也行的
返回数据
[{"name":"老三","id":"723A2733-DFD7-4193-9A81-4E85A708326B","username":"张三"},{"name":"老四","id":"E31B5335-EFD9-4D37-9AE2-4CD327D418BE","username":"李四"},{"name":"老五","id":"A9D70526-A793-432A-9E4A-7548F9EE3D19","username":"王五"}]


c.根据 ID 查询用户

url: http://127.0.0.1:8080/api/users/A9D70526-A793-432A-9E4A-7548F9EE3D19
method: GET
parameters:

直接在浏览器访问
返回数据
{"id":"A9D70526-A793-432A-9E4A-7548F9EE3D19","username":"王五","name":"老五"}


0x01 创建关联关系

下篇正在准备中…
敬请期待~


0x02 我的作品

欢迎体验我的作品之一:小五笔 86 版
五笔学习好帮手!
App Store 搜索即可~


猜你喜欢

转载自blog.csdn.net/xjh093/article/details/124173585
今日推荐