Как получить справочную информацию о модели в Yesod? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть 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 голосов
/ 22 февраля 2019

Я не смог найти какой-либо прямой способ (похожий на аннотации) для получения ссылочной информации о модели.Но есть два способа сделать это.

  1. Incase, если ваша база данных SQL.Вы можете использовать esqueleto https://github.com/bitemyapp/esqueleto/blob/master/README.md.
  2. Напишите некоторый шаблонный код и получите информацию.

Создайте тип HouseResp, который будет представлять ваше тело ответа, включая информацию о человеке и адресе.

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

Затем измените 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')
...