如何在Yesod中获得参考模型信息?

时间:2019-02-20 13:20:37

标签: haskell yesod haskell-persistent

我有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": "hey@email.com", "name": "Moto", "telephone": "xxxxxxxxxx"},"id":3}]

是否有任何方法可以向查询中添加诸如getForiegnData之类的信息,而这会给我带来很多麻烦?或任何其他解决方案?

1 个答案:

答案 0 :(得分:0)

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

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

创建HouseResp类型,它将代表您的回复正文,包括个人和地址信息。

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

然后,修改getHouseR以使用可用的参考ID来获取每所房屋的完整信息。

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')