Query
Query
類對(duì)Fluent
的所有交互都顯得很強(qiáng)大。無論是使用.find()
還是將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中都調(diào)用到Query
土砂。
Querying Models
每個(gè)符合Model
的類型都會(huì)獲得一個(gè)靜態(tài)的 .query()
方法示罗。
let query = try User.query()
這就是創(chuàng)建一個(gè)用戶查詢Query<User>
No Database
.query()
方法用try
標(biāo)記督赤,因?yàn)槿绻?code>Model沒有設(shè)置其靜態(tài)數(shù)據(jù)庫(kù)屬性蛤签,它可能會(huì)引發(fā)錯(cuò)誤。
User.database = drop.database
當(dāng)通過模型作為準(zhǔn)備時(shí)师痕,此屬性將自動(dòng)設(shè)置溃睹。
Filter
最常見的查詢類型包括過濾數(shù)據(jù)。
let smithsQuery = try User.query().filter("last_name", "Smith")
以下是向查詢添加等于過濾器胰坟∫蚱可以看到,查詢可以連接過濾器笔横。
除了等于過濾器竞滓,還有其他過濾器類型的Filter.Comparison
。
let over21 = try User.query().filter("age", .greaterThanOrEquals, 21)
Scope
過濾器也可以在集上運(yùn)行吹缔。
let coolPets = try Pet.query().filter("type", .in, ["Dog", "Ferret"])
這里只有寵物狗或雪貂類型返回商佑。相反的類型為notIn
。
Contains
也可以應(yīng)用部分匹配的過濾器厢塘。
let statesWithNew = try State.query().filter("name", contains: "New")
Retrieving
有兩種運(yùn)行查詢的方法茶没。
ALL
可以獲取所有匹配的實(shí)體。這返回一個(gè)[Model]
的數(shù)組.
let usersOver21 = try User.query().filter("age", .greaterThanOrEquals, 21).all()
First
可以獲取第一個(gè)匹配實(shí)體晚碾,返回一個(gè)可選的Model?
let firstSmith = try User.query().filter("last_name", "Smith").first()
Union
其他模型可以加入查詢以幫助過濾礁叔,結(jié)果仍然是[模型]還是模型?用于創(chuàng)建查詢的類型迄薄。
let usersWithCoolPets = try User.query()
.union(Pet.self)
.filter(Pet.self, "type", .in, ["Dog", "Ferret"])
這里用戶集合union
到寵物集合里,只有狗或白鼬的用戶將被返回煮岁。
Keys
union
方法假設(shè)查詢表有加入表的外鍵標(biāo)識(shí)符讥蔽。
用戶和寵物的上述示例假定以下模式。
users
- id
pets
- id
- user_id
定制外鍵可以通過重載提供union
画机。
Raw Queries
由于Fluent
專注于與模型進(jìn)行交互冶伞,每個(gè)查詢需要一個(gè)模型類型。如果要進(jìn)行不基于模型的原始數(shù)據(jù)庫(kù)查詢步氏,則應(yīng)使用底層Fluent
驅(qū)動(dòng)程序來執(zhí)行此操作响禽。
if let mysql = drop.database?.driver as? MySQLDriver {
let version = try mysql.raw("SELECT @@version")
}
繼續(xù)學(xué)習(xí)vapor學(xué)習(xí)教程-目錄