vapor fluent[sqlite] relations
父子關係/一對多/Parent-Child/one-many
星系中有很多恆星,怎麼表示這種關係呢?
struct Galaxy: SQLiteModel {
var id:Int? = nil
var name: String
}
struct Planet: SQLiteModel {
var id: Int?
var name: String
var galaxyID: Int
}
fluent 中通過extension
在其中新增Parent和Children來實現這種特殊的關聯關係
extension Galaxy{
var planets: Children<Galaxy, Planet>{
return children(\.galaxyID)
}
}
extension Planet{
var galaxy: Parent<Planet, Galaxy>{
return parent(\.galaxyID)
}
}
其中Parent和Children都是一種<From, To>
的關係通過keypath來明確怎麼關聯
使用
var galaxy: Galaxy?
galaxy?.planets.query(on: <#T##DatabaseConnectable#>)
var planet: Planet?
planet!.galaxy.get(on: <#T##DatabaseConnectable#>)
兄弟關係/多對多/ many-many
在這種關係中是兩個獨立的Model,為了將他們直觀的關聯需要一個第三方的方式將其聯絡起來,我們稱之為pivot
下面我們就來看一例子:搜尋✨時往往會給他們做個標籤---類地行星 液體星球等,那我們怎麼來關聯呢
上圖中是太陽系中星球的表示
我們建立了三個Model--Planet,Tag, PlanetTag:
struct Planet: SQLiteModel {
var id: Int?
var name: String
var galaxyID: Int
}
struct Tag: SQLiteModel {
var id: Int?
var name: String
}
struct PlanetTag: SQLitePivot {
static var leftIDKey: WritableKeyPath<PlanetTag, Int> = \.planetID
static var rightIDKey: WritableKeyPath<PlanetTag, Int> = \.tagID
typealias Left = Planet
typealias Right = Tag
var id: Int?
var planetID: Int
var tagID: Int
}
PlanetTag作為一箇中間紐帶將Tag和Palnet關聯了起來:我們可以通過這種關係搜尋具有某種Tag的Planet也可以通過Planet來檢視大致發現了哪些型別的星球
同樣的Sibling關係也是通過extension
中新增
extension Planet {
// this planet's related tags
var tags: Siblings<Planet, Tag, PlanetTag> {
return siblings()
}
}
extension Tag {
// all planets that have this tag
var planets: Siblings<Tag, Planet, PlanetTag> {
return siblings()
}
}
Siblings是一種<From, To, Through>,可以解釋為將A和B通過C進行關聯
使用
var p: Planet?
p?.tags.query(on: <#T##DatabaseConnectable#>)
var tag: Tag?
tag?.planets.query(on: <#T##DatabaseConnectable#>)
修改關聯關係 Modifiable Pivot
Pivot要想具有可修改功能需要conformModifiablePivot
extension PlanetTag: ModifiablePivot {
init(_ planet: Planet, _ tag: Tag) throws {
planetID = try planet.requireID()
tagID = try tag.requireID()
}
}
使用
let planet: Planet = ...
let tag: Tag = ...
planet.tags.attach(tag, on: ...)
相關文章
- 聊聊 VaporVapor
- 搞事情之 Vapor 初探Vapor
- Django REST Framework中的Serializer relationsDjangoRESTFramework
- PyQt-Fluent-Widgets:一個 Fluent Design 風格的元件庫QT元件
- Vapor如何配置MySQL資料庫VaporMySql資料庫
- chap8-fluent pythonPython
- Swift Web 開發之 Vapor – 路由(二)SwiftWebVapor路由
- Fluent-UI 一套受 Fluent Design System 啟發的 React 元件庫UIReact元件
- sqlite 視覺化工具SQLite studioSQLite視覺化
- 論文閱讀:Sequence to sequence learning for joint extraction of entities and relations
- fluent python是什麼意思Python
- Swift Web 開發之 Vapor – 模版 Leaf(三)SwiftWebVapor
- Laravel 生態系統Forge Vapor Nova EnvoyerLaravelVapor
- android:SQliteAndroidSQLite
- sqlite更新SQLite
- python sqlitePythonSQLite
- Sqlite學習筆記之Sqlite歷史SQLite筆記
- wavesurfer fluent-ffmpeg提取音訊音訊
- FluentAspects -- 基於 Fluent API 的 AopAPI
- Swift vapor3 - Async-非同步處理SwiftVapor非同步
- SQLite資料庫管理器:SQLPro for SQLite for MacSQLite資料庫Mac
- Android中SQLiteAndroidSQLite
- sqlite 學習SQLite
- SQLite學習SQLite
- SQLite簡介SQLite
- sqlite封裝SQLite封裝
- Swift web服務框架Vapor 學習資源整理SwiftWeb框架Vapor
- Fluent-Validator 業務校驗器
- 高效操控SQLite資料庫,盡在SQLPro for SQLite for MacSQLite資料庫Mac
- SQLPro for SQLite Mac(SQLite資料庫管理工具)SQLiteMac資料庫
- Python資料庫模組(sqlite3,SQLite3)Python資料庫SQLite
- SQLite 命令列客戶端 sqlite3 使用指南SQLite命令列客戶端
- 使用 Swift 和 Vapor 構建區塊鏈伺服器SwiftVapor區塊鏈伺服器
- C# 使用Fluent API 建立自己的DSLC#API
- SQLite 的 CodeFirst 模式SQLite模式
- Django & SQLite All In OneDjangoSQLite
- 教你使用SQLite VacuumSQLite
- SQLite Insert 語句SQLite