Давайте предположим, что у меня есть очень простая БД с внешним ключом (для простоты примера: одна таблица с собственной ссылкой; контекст - моделирование финансового инструмента):
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
Я заметил, что я могу извлечь определенные c поля из результатов, используя автоматически сгенерированные функции, например,
getTicker :: Entity Instrument -> String
getTicker = instrumentTicker . entityVal
Однако, когда я пытаюсь обратиться к значению, указанному через внешний ключ, я получаю:
getDenomination :: Entity Instrument -> Key Instrument
getDenomination = instrumentDenomination . entityVal
Мой вопрос: как я могу сослаться на оставшиеся значения, которые соответствуют полученному «Ключевому инструменту», например, как я могу получить «имя» поле указанной записи?
РЕДАКТИРОВАТЬ:
Я пытался написать подзапрос, но пока ничего хорошего. Я попробовал:
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
Как правильно использовать аргумент «Ключевой инструмент» в моем подзапросе?