[英]Haskell persistent - getting value via foreign key
讓我們假設我有一個非常簡單的帶有外鍵的數據庫(為了簡單起見:一個帶有自我引用的表;上下文 - 對金融工具建模):
Instrument
ticker String
name String
denomination InstrumentId -- FK !!
domicile Country
source DataSource
UniqueT ticker
deriving Eq Show
然后我可以通過執行來獲取所有行:
getAll :: (MonadIO m, MonadLogger m) => SqlReadT m [Entity Instrument]
getAll = select $ from $ return
我注意到我可以使用自動生成的函數從結果中提取特定字段,例如
getTicker :: Entity Instrument -> String
getTicker = instrumentTicker . entityVal
但是,當我嘗試引用通過外鍵引用的值時,我得到:
getDenomination :: Entity Instrument -> Key Instrument
getDenomination = instrumentDenomination . entityVal
我的問題:我如何引用與接收到的“Key Instrument”相對應的剩余值,例如如何獲取引用記錄的“name”字段?
編輯:
我試過寫一個子查詢,但到目前為止還不好。 我嘗試的是:
getInstrumentByKey :: (MonadIO m, MonadLogger m) => Key Instrument -> SqlBackendT m (Entity Instrument)
getInstrumentByKey key =
select $ from $ \i ->
where_ (i ^. InstrumentId ==. key) -- type error, InstrumentKey is of type "SqlExpr (Value (Key Instrument))", while key is "Key Instrument"
return i
如何在我的子查詢中正確使用“Key Instrument”參數?
稍微擴展一下我在評論中所說的話:
總的來說,您有兩種選擇。 一種是按 ID 進行另一次查找,如Persistent 文檔中所述(請參閱“按 ID 獲取”部分)。 這並不理想,因為它涉及對數據庫的第二次訪問。
但由於您顯然使用的是 SQL 數據庫,這正是連接的用途。 而且您已經在使用 Esqueleto,它允許您將 SQL 查詢 - 包括連接(您無法僅用 Persistent 表達) - 轉換為 Haskell。 在這種情況下,您將使用denomination
字段和 ID 將您的表連接到其自身上。 同樣,圖書館的文檔很容易理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.