天天看點

【Vapor】05 Chapter 7: CRUD Database Operations

0x00 Chapter 7: CRUD Database Operations

在 ​

​routes.swift​

​​ 檔案内寫各種路由

操作資料庫的記錄

1.create

建立記錄,之前的文章已經寫過了

需要送出資料

url: ​

​http://127.0.0.1:8080/api/acronyms​

​​ method: ​

​POST​

​ parameters: ​

​{"short": "TGD", "long":"Tomorrow is a good day"}​

app.post("api", "acronyms") { req -> EventLoopFuture<Acronym> in
        let acronym = try req.content.decode(Acronym.self)
        return acronym.save(on: req.db).map {
            acronym
        }
    }      

2.retrieve

擷取所有記錄

url: ​

​http://127.0.0.1:8080/api/acronyms​

​​ method: ​

​GET​

​ parameters: ​

​無​

app.get("api", "acronyms") { req -> EventLoopFuture<[Acronym]> in
        Acronym.query(on: req.db).all()
    }      

3.retrieve a single acronym

根據 ​​

​ID​

​ 查詢記錄

url: ​

​http://127.0.0.1:8080/api/acronyms/<ID>​

​​ method: ​

​GET​

​ parameters: ​

​ID​

app.get("api", "acronyms", ":acronymID") { req -> EventLoopFuture<Acronym> in
        Acronym.find(req.parameters.get("acronymID"), on: req.db)
            .unwrap(or: Abort(.notFound))
    }      

4.update

根據 ​​

​ID​

​ 更新記錄

url: ​

​http://127.0.0.1:8080/api/acronyms/<ID>​

​​ method: ​

​UPDATE​

​ parameters: ​

​{"short": "TGD1", "long":"Tomorrow is a good day1"}​

app.put("api", "acronyms", ":acronymID") { req -> EventLoopFuture<Acronym> in
        let updatedAcronym = try req.content.decode(Acronym.self)
        return Acronym.find(req.parameters.get("acronymID"), on: req.db)
            .unwrap(or: Abort(.notFound)).flatMap { acronym in
                acronym.short = updatedAcronym.short
                acronym.long = updatedAcronym.long
                return acronym.save(on: req.db).map {
                    acronym
                }
            }
    }      

5.delete

根據 ​​

​ID​

​ 删除記錄

url: ​

​http://127.0.0.1:8080/api/acronyms/<ID>​

​​ method: ​

​DELETE​

​ parameters: ​

​ID​

app.delete("api", "acronyms", ":acronymID") { req -> EventLoopFuture<HTTPStatus> in
        Acronym.find(req.parameters.get("acronymID"), on: req.db)
            .unwrap(or: Abort(.notFound))
            .flatMap { acronym in
                acronym.delete(on: req.db)
                    .transform(to: .noContent)
            }
    }      

6.filter

根據參數查詢記錄

url: ​

​http://127.0.0.1:8080/api/acronyms/search?term=OMG​

​​ method: ​

​GET​

​ parameters: ​

​無​

app.get("api", "acronyms", "search") { req -> EventLoopFuture<[Acronym]> in
        guard let searchTerm = req.query[String.self, at: "term"] else {
            throw Abort(.badRequest)
        }
        return Acronym.query(on: req.db)
            .filter(\.$short == searchTerm)
            .all()
    }      

filter group

url: ​​

​http://127.0.0.1:8080/api/acronyms/search?term=Oh+My+God​

​​ method: ​

​GET​

​ parameters: ​

​無​

app.get("api", "acronyms", "search") { req -> EventLoopFuture<[Acronym]> in
        guard let searchTerm = req.query[String.self, at: "term"] else {
            throw Abort(.badRequest)
        }
        return Acronym.query(on: req.db).group(.or) { or in
            or.filter(\.$short == searchTerm)
            or.filter(\.$long == searchTerm)
        }.all()
    }      

7.first result

查詢第一條記錄

url: ​

​http://127.0.0.1:8080/api/acronyms/first​

​​ method: ​

​GET​

​ parameters: ​

​無​

app.get("api", "acronyms", "first") { req -> EventLoopFuture<Acronym> in
        Acronym.query(on: req.db).first().unwrap(or: Abort(.notFound))
    }      

8.sorting results

對所有查詢記錄進行排序

app.get("api", "acronyms", "sorted") { req -> EventLoopFuture<[Acronym]> in
        Acronym.query(on: req.db).sort(\.$short, .ascending).all()
    }      

0x01 我的作品