如何在Yesod中获取引用的模型信息?

问题描述 投票:1回答:1

我有3个型号

Address json
    number Text
    street Text
    pincode Text
    deriving Show
Person json
    email Text
    name Text
    telephone Text
    deriving Show
House json
    rent Int
    ownerId PersonId
    addressId AddressId
    deriving Show

我想进入所有的房子。我可以做到这一点

getHouseR :: Handler Value
getHouseR = do
 houses <- runDB $ selectList [] [Asc HouseRent]
 return $ toJSON houses

但我只参考了像person & address这样的其他实体。

[{"rent":8000,"addressId":4,"ownerId":1,"id":3},{"rent":10000,"addressId":2,"ownerId":1,"id":1}]

我想获得房子的完整信息,这意味着,解决ownerId & addressId并获得可能看起来像的数据,

[{"rent":8000,"address":{"number": "23", "street": "12/B", "pincode": "111111"},"owner":{"email": "[email protected]", "name": "Moto", "telephone": "xxxxxxxxxx"},"id":3}]

有没有办法在查询中添加像getForiegnData这样的信息,这会把我这一切都拿来?或任何其他解决方案?

haskell yesod haskell-persistent
1个回答
0
投票

我找不到任何直接的方式(类似于注释)来获取引用的模型信息。但我们有两种方法可以完成这项工作。

  1. Incase,如果您的数据库是SQL。你可以使用esqueleto https://github.com/bitemyapp/esqueleto/blob/master/README.md
  2. 写一些样板代码并获取信息。

创建HouseResp类型,它将代表您的响应主体,包括人员和地址信息。

data HouseResp = HouseResp
  { rent :: Int
  , owner :: Person
  , address :: Address
  }

然后,通过使用可用的引用ID修改getHouseR以获取每个房屋的完整信息。

getHouseR :: Handler Value
getHouseR = do
  housesWithReference <- runDB $ selectList [] [Asc HouseRent]
  houses <- sequence (Import.map getCompleteHouse housesWithReference)
  return $ toJSON houses


getCompleteHouse :: Entity House -> Handler HouseResp
getCompleteHouse house = runDB $ do
  let rent' = houseRent (entityVal house)
  person <- getJust (houseOwnerId (entityVal house))
  address' <- getJust (houseAddressId (entityVal house))
  return (HouseResp rent' person address')
© www.soinside.com 2019 - 2024. All rights reserved.