Query
Query
类对Fluent
的所有交互都显得很强大。无论是使用.find()
还是将数据保存到数据库中都调用到Query
。
Querying Models
每个符合Model
的类型都会获得一个静态的 .query()
方法。
let query = try User.query()
这就是创建一个用户查询Query<User>
No Database
.query()
方法用try
标记,因为如果Model
没有设置其静态数据库属性,它可能会引发错误。
User.database = drop.database
当通过模型作为准备时,此属性将自动设置。
Filter
最常见的查询类型包括过滤数据。
let smithsQuery = try User.query().filter("last_name", "Smith")
以下是向查询添加等于过滤器。可以看到,查询可以连接过滤器。
除了等于过滤器,还有其他过滤器类型的Filter.Comparison
。
let over21 = try User.query().filter("age", .greaterThanOrEquals, 21)
Scope
过滤器也可以在集上运行。
let coolPets = try Pet.query().filter("type", .in, ["Dog", "Ferret"])
这里只有宠物狗或雪貂类型返回。相反的类型为notIn
。
Contains
也可以应用部分匹配的过滤器。
let statesWithNew = try State.query().filter("name", contains: "New")
Retrieving
有两种运行查询的方法。
ALL
可以获取所有匹配的实体。这返回一个[Model]
的数组.
let usersOver21 = try User.query().filter("age", .greaterThanOrEquals, 21).all()
First
可以获取第一个匹配实体,返回一个可选的Model?
let firstSmith = try User.query().filter("last_name", "Smith").first()
Union
其他模型可以加入查询以帮助过滤,结果仍然是[模型]还是模型?用于创建查询的类型。
let usersWithCoolPets = try User.query()
.union(Pet.self)
.filter(Pet.self, "type", .in, ["Dog", "Ferret"])
这里用户集合union
到宠物集合里,只有狗或白鼬的用户将被返回。
Keys
union
方法假设查询表有加入表的外键标识符。
用户和宠物的上述示例假定以下模式。
users
- id
pets
- id
- user_id
定制外键可以通过重载提供union
。
Raw Queries
由于Fluent
专注于与模型进行交互,每个查询需要一个模型类型。如果要进行不基于模型的原始数据库查询,则应使用底层Fluent
驱动程序来执行此操作。
if let mysql = drop.database?.driver as? MySQLDriver {
let version = try mysql.raw("SELECT @@version")
}
继续学习vapor学习教程-目录