vapor学习教程-Query

Query

Query类对Fluent的所有交互都显得很强大。无论是使用.find()还是将数据保存到数据库中都调用到Query

Querying Models


每个符合Model的类型都会获得一个静态的 .query()方法。

let query = try User.query()

这就是创建一个用户查询Query

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学习教程-目录

你可能感兴趣的:(vapor学习教程-Query)