0

给定一个用户,我试图选择与该用户所在的组织相关的事件列表。UserOrg 表描述了哪些 OrgId 对应于给定的 UserId。

我有这些表:

User
    email Text
    name Text
    UniqueUser email
    deriving Typeable
Event
    name Text
    description Text
    dateTime UTCTime
    userId UserId
    orgId OrgId
    deriving Show
Org
    name Text
    description Text
    deriving Show
UserOrg
    userId UserId
    orgId OrgId

目前我正在尝试这个:

getEventR :: Handler Html
getEventsR = do
    muser <- maybeAuth
    eventList <- runDB $ 
        case muser of
            Nothing -> []
            (Just euser) -> selectList [ EventOrgId <-. (userOrgIds $ entityKey euser) ] []
    defaultLayout $ do
        setTitle "Events"
        $(widgetFile "events")

userOrgIds :: UserId -> [OrgId]
userOrgIds userid = do
    rows <- liftHandler $ runDB $ selectList [ UserOrgUserId ==. userid ] []
    return $ [ userOrgOrgId $ entityVal $ erow | erow <- rows ]

但是我收到一个类型错误,说 userOrgIds 的返回返回 a[[OrgId]]而不是[OrgId],并且 concat 在这里不起作用

我要解决这个问题了吗?我应该rawQuery在这种情况下使用吗?

4

1 回答 1

0

这是一个好的开始,但我发现这有很多问题。

getEventR :: Handler Html
getEventsR = do

这些函数名称不匹配。

    muser <- maybeAuth
    eventList <- runDB $ 
        case muser of
            Nothing -> []
            (Just euser) -> selectList [ EventOrgId <-. (userOrgIds $ entityKey euser) ] []

我不确定这会奏效;您可能希望您的Nothing分支机构提供pure [].

    defaultLayout $ do
        setTitle "Events"
        $(widgetFile "events")

这看起来不错。

userOrgIds :: UserId -> [OrgId]
userOrgIds userid = do
    rows <- liftHandler $ runDB $ selectList [ UserOrgUserId ==. userid ] []
    return $ [ userOrgOrgId $ entityVal $ erow | erow <- rows ]

这绝对行不通。在您的类型签名中,您已经说过它是一个纯函数;它需要一个UserId(它是 的同义词Key User),并返回一个OrgId(同样,与 同义的Key Org)值的列表。但是在您的实现中,您使用的是liftHandler,runDBselectList. 这些都是有效的东西!

以下是我将如何编写您的处理程序。

getEventsR :: Handler Html
getEventsR = do
  mUser <- maybeAuth
  eventList <- case mUser of
    Nothing -> pure []
    Just user -> runDB $ do
      orgs <- selectList [ UserOrgUserId ==. entityKey user ] []
      selectList [ EventOrgId <-. map entityKey orgs ] []
  defaultLayout $ do
    setTitle "Events"
    $(widgetFile "events")

我在没有编译器的情况下编写它,但它应该是正确的。

于 2020-01-19T12:01:23.887 回答