Query
類貫穿Fluent交互的整個(gè)過程慌洪,無論是使用.find()
查詢數(shù)據(jù)還是將數(shù)據(jù)保存到數(shù)據(jù)庫,都要用到Query
庇麦。
Querying Models
遵守Model協(xié)議的類型都會(huì)有一個(gè)靜態(tài)方法.query()
。
let query = try User.query()
這就創(chuàng)建了一個(gè).query()
喜德。
No Database
使用 try
調(diào)用.query()
方法是因?yàn)槿绻鸐odel對(duì)應(yīng)的數(shù)據(jù)庫不存在就會(huì)拋出異常山橄。
User.database = drop.database
當(dāng)Model
作為preparation
的時(shí)候這個(gè)屬性會(huì)自動(dòng)添加。
Fileter
大多數(shù)查詢都會(huì)進(jìn)行數(shù)據(jù)過濾(條件查詢)舍悯。
let smithsQuery = try User.query().filter("last_name", "Smith")
上面是一個(gè)簡(jiǎn)單的equals
查詢航棱。如你所見,可以將filter()
鏈接在query()
之后萌衬。
除了equals
之外饮醇,還有很多其他的Filter.Comparison
。
let over21 = try User.query().filter("age", .greaterThanOrEquals, 21)
Scope
過濾條件的套用:
let coolPets = try Pet.query().filter("type", .in, ["Dog", "Ferret"])
這里只會(huì)返回Dog
或Ferret
類型的數(shù)據(jù)秕豫。相反則是notIn
朴艰。
Contains
部分匹配的過濾條件也可以使用:
let statesWithNew = try State.query().filter("name", contains: "New")
Retrieving
有兩種方法進(jìn)行查詢。
All
all()
進(jìn)行整體匹配混移,返回所有滿足查詢條件的[Model]
數(shù)組祠墅。下面的例子會(huì)返回所有age>21
的user
。
let usersOver21 = try User.query().filter("age", .greaterThanOrEquals, 21).all()
First
first()
會(huì)匹配第一個(gè)滿足查詢條件的數(shù)據(jù)沫屡,返回的是Model?
類型饵隙,下面返回的是一個(gè)user
。
let firstSmith = try User.query().filter("last_name", "Smith").first()
Union
聯(lián)合查詢沮脖,即使用其他Model
輔助查詢金矛。結(jié)果會(huì)返回[Model]
或者Model?
芯急。
let usersWithCoolPets = try User.query()
.union(Pet.self)
.filter(Pet.self, "type", .in, ["Dog", "Ferret"])
上面就是用User
集合與Pet
集合聯(lián)合查詢,返回所有擁有寵物dog或ferret的User
驶俊。
Keys
調(diào)用union
方法查詢的前提是被查詢的表具有和輔助表關(guān)聯(lián)的外部標(biāo)識(shí)娶耍。(也就是兩個(gè)表有關(guān)聯(lián)的字段。)
上例中有如下關(guān)聯(lián):
users
- id
pets
- id
- user_id
外部標(biāo)識(shí)的key
可以通過重載提供給union
饼酿。
Raw Queries
由于Fluent專注于與Model
進(jìn)行交互榕酒,因此每個(gè)Query
需要一個(gè)模型類。 如果要進(jìn)行不基于Model
的原始數(shù)據(jù)庫查詢故俐,則應(yīng)使用底層Fluent驅(qū)動(dòng)程序來執(zhí)行此操作想鹰。
if let mysql = drop.database?.driver as? MySQLDriver {
let version = try mysql.raw("SELECT @@version")
}
<b>總結(jié):</b>本節(jié)講了如何進(jìn)行數(shù)據(jù)查詢以及過濾查詢的方法。最后節(jié)后也說明了如何進(jìn)行基于sql語句的原始查詢方法药版。