0Pricing
Swift Academy · บทเรียน

ORM และโมเดลแบบ Fluent

บันทึกข้อมูลด้วย Fluent ORM ของ Vapor

ORM และโมเดลแบบ Fluent เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

Fluent คืออะไร

Fluent คือ ORM ของ Vapor ซึ่งจับคู่คลาส Swift กับแถวในฐานข้อมูล และรองรับ PostgreSQL, MySQL, SQLite และ MongoDB ผ่าน API เดียว คุณเขียน Swift ส่วน Fluent จะเขียน SQL ให้

import Fluent
import Vapor

การกำหนดโมเดล

โมเดล Fluent คือ final class ที่สอดคล้องกับ Model และโดยทั่วไปจะสอดคล้องกับ Content ด้วย โมเดลจะประกาศ schema (ชื่อตาราง) และคุณสมบัติ @ID สำหรับคีย์หลัก

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

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

    init() {}
}

ตัวห่อคุณสมบัติ @Field

จับคู่คอลัมน์ที่จัดเก็บไว้ด้วย @Field คีย์นี้คือชื่อคอลัมน์ในฐานข้อมูล เพิ่มคุณสมบัติหนึ่งรายการต่อหนึ่งคอลัมน์ที่ต้องการบันทึก

@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 จำลองความสัมพันธ์ของโมเดลด้วยตัวห่อคุณสมบัติ ได้แก่ @Parent และ @Child สำหรับความสัมพันธ์แบบหนึ่งต่อหนึ่งหรือหนึ่งต่อหลาย และ @Siblings สำหรับความสัมพันธ์แบบหลายต่อหลาย ตัวห่อเหล่านี้กำหนดคีย์ต่างประเทศและเปิดใช้การโหลดล่วงหน้าด้วย .with(...)

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

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

ตรวจสอบอย่างรวดเร็ว: Fluent

ตรวจสอบความเข้าใจเกี่ยวกับ ORM ของคุณ

สรุป: ORM และโมเดลของ Fluent

ตอนนี้คุณสามารถจัดเก็บข้อมูลถาวรด้วย Fluent ได้แล้ว:

  • กำหนด final class ที่เป็น Model พร้อมตัวห่อคุณสมบัติ @ID และ @Field รวมถึง schema
  • สร้างตารางผ่าน AsyncMigration และเรียกใช้ด้วย autoMigrate()
  • ดำเนินการ CRUD ด้วย save, query(on:), find, update และ delete
  • จำลองความสัมพันธ์ของโมเดลด้วย @Parent, @Child และ @Siblings พร้อมโหลดล่วงหน้าผ่าน .with

คำถามที่พบบ่อย

บทเรียน “ORM และโมเดลแบบ Fluent” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ORM และโมเดลแบบ Fluent” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ORM และโมเดลแบบ Fluent”

บันทึกข้อมูลด้วย Fluent ORM ของ Vapor คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ORM และโมเดลแบบ Fluent” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การกำหนดเส้นทางและจัดการคำขอ
  2. การเข้ารหัสเนื้อหาและ JSON
  3. ORM และโมเดลแบบ Fluent
  4. มิดเดิลแวร์และการยืนยันตัวตน
← กลับไปที่ Swift Academy