0Pricing
Swift Academy · レッスン

Fluent ORMとモデル

VaporのFluent ORMでデータを永続化します。

「Fluent ORMとモデル」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

Fluent とは

Fluent は Vapor の ORM です。Swift のクラスをデータベースの行に対応付け、単一の API で PostgreSQL、MySQL、SQLite、MongoDB をサポートします。Swift で記述すれば、Fluent が SQL を生成します。

import Fluent
import Vapor

モデルの定義

Fluent のモデルは、Model に準拠する final class で、通常は Content にも準拠します。schema(テーブル名)と、主キー用の @ID プロパティを宣言します。

final class Planet: Model, Content {
    static let schema = "planets"

    @ID(key: .id)
    var id: UUID?

    init() {}
}

@Field プロパティラッパー

保存するカラムは @Field で対応付けます。キーはデータベースのカラム名です。永続化するカラムごとにプロパティを 1 つ追加します。

@Field(key: "name")
var name: String

@Field(key: "diameter_km")
var diameterKm: Int

完全なモデル

モデルには、コード内でインスタンスを作成できるように、必須の空の init() に加えてメンバー単位のイニシャライザーも必要です。

final class Planet: Model, Content {
    static let schema = "planets"
    @ID(key: .id) var id: UUID?
    @Field(key: "name") var name: String
    init() {}
    init(id: UUID? = nil, name: String) {
        self.id = id
        self.name = name
    }
}

マイグレーション

マイグレーションは、データベースのスキーマを作成または変更します。AsyncMigration に準拠し、適用を行う prepare と、取り消しを行う revert を実装します。

struct CreatePlanet: AsyncMigration {
    func prepare(on db: Database) async throws {
        try await db.schema("planets")
            .id()
            .field("name", .string, .required)
            .create()
    }
    func revert(on db: Database) async throws {
        try await db.schema("planets").delete()
    }
}

マイグレーションの登録

設定でマイグレーションを app.migrations に追加し、app.autoMigrate() または migrate コマンドで実行します。

app.migrations.add(CreatePlanet())
try await app.autoMigrate()

レコードの保存

モデルのインスタンスを作成し、リクエストのデータベースを指定して save(on:) を呼び出します。Fluent が INSERT を実行し、生成された id を設定します。

app.post("planets") { req async throws -> Planet in
    let planet = try req.content.decode(Planet.self)
    try await planet.save(on: req.db)
    return planet
}

レコードのクエリ

Model.query(on:) を使って、流れるようにクエリを構築します。.all() はすべての行を返し、必要に応じてフィルターや並べ替えを連結できます。

app.get("planets") { req async throws -> [Planet] in
    try await Planet.query(on: req.db).all()
}

ID によるフィルタリングと検索

find(_:on:) は主キーで取得し、オプショナルを返します。filter を使うと、カラムの値で結果を絞り込めます。

let earth = try await Planet.query(on: req.db)
    .filter(\.$name == "Earth")
    .first()

let byId = try await Planet.find(someUUID, on: req.db)

更新と削除

取得したモデルのプロパティを変更して update(on:) を呼び出すか、delete(on:) で削除します。どちらもデータベースに対して非同期で実行されます。

if let planet = try await Planet.find(id, on: req.db) {
    planet.name = "Renamed"
    try await planet.update(on: req.db)
    // or: try await planet.delete(on: req.db)
}

リレーションシップ

Fluent では、プロパティラッパーを使ってモデルのリレーションシップを定義します。1 対 1 または 1 対多には @Parent と @Child、多対多には @Siblings を使います。これらは外部キーを定義し、.with(...) による Eager Loading を可能にします。

@Parent(key: "star_id")
var star: Star

// query eagerly loading the parent
Planet.query(on: req.db).with(\.$star).all()

クイックチェック:Fluent

ORM に関する理解度を確認しましょう。

まとめ:Fluent ORM とモデル

これで Fluent を使ってデータを永続化できるようになりました。

  • @ID と @Field のプロパティラッパー、および schema を持つ final class の Model を定義します。
  • AsyncMigration でテーブルを作成し、autoMigrate() で実行します。
  • save、query(on:)、find、update、delete で CRUD 操作を行います。
  • @Parent、@Child、@Siblings でモデルのリレーションシップを定義し、.with で Eager Loading を行います。

よくある質問

「Fluent ORMとモデル」レッスンは無料ですか?

はい。「Fluent ORMとモデル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「Fluent ORMとモデル」で何を学びますか?

VaporのFluent ORMでデータを永続化します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Fluent ORMとモデル」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ルーティングとリクエスト処理
  2. コンテンツとJSONエンコーディング
  3. Fluent ORMとモデル
  4. ミドルウェアと認証
← Swift Academyに戻る