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: ...)
相關文章
- Vapor奇幻之旅(05 Fluent)Vapor
- 聊聊 VaporVapor
- Django REST Framework中的Serializer relationsDjangoRESTFramework
- 搞事情之 Vapor 初探Vapor
- Vapor奇幻之旅(06 PostgreSQL)VaporSQL
- Vapor系列教程 - 介紹Vapor
- Vapor如何配置MySQL資料庫VaporMySql資料庫
- Swift 版本的 Laravel:Vapor 簡介SwiftLaravelVapor
- Vapor文件學習廿八: HTTP -ResponseVaporHTTP
- PyQt-Fluent-Widgets:一個 Fluent Design 風格的元件庫QT元件
- 【SQLite】SQLite簡介SQLite
- chap8-fluent pythonPython
- Swift Web 開發之 Vapor – 路由(二)SwiftWebVapor路由
- Vapor 2.0 - MySQL提供程式(MySQL Provider)VaporMySqlIDE
- Fluent-UI 一套受 Fluent Design System 啟發的 React 元件庫UIReact元件
- SQLite的sqlite_sequence表SQLite
- SQLite的sqlite_master表SQLiteAST
- 【SQLite】SQLite的簡單使用SQLite
- SQLiteSQLite
- FluentAspects -- 基於 Fluent API 的 AopAPI
- fluent python是什麼意思Python
- wavesurfer fluent-ffmpeg提取音訊音訊
- 使用 C# 設計 Fluent InterfaceC#
- Swift Web 開發之 Vapor – 模版 Leaf(三)SwiftWebVapor
- 服務端Swift - Vapor2.0介紹服務端SwiftVapor
- Laravel 生態系統Forge Vapor Nova EnvoyerLaravelVapor
- 論文閱讀:Sequence to sequence learning for joint extraction of entities and relations
- sqlite 視覺化工具SQLite studioSQLite視覺化
- Swift vapor3 - Async-非同步處理SwiftVapor非同步
- 設計流暢的API(Fluent API)API
- fluent python 讀書筆記 1Python筆記
- Entity Framework Code-First(10):Fluent APIFrameworkAPI
- sqlite更新SQLite
- Sqlite學習筆記之Sqlite歷史SQLite筆記
- Swift web服務框架Vapor 學習資源整理SwiftWeb框架Vapor
- ServerSide - 01-Vapor在mac下的安裝ServerIDEVaporMac
- 介紹 Eloquent 關聯中的多型關聯(Polymorphic Relations)多型
- C# 使用Fluent API 建立自己的DSLC#API