如何使用 yesod-persistent 创建单列列表?
How to create a list of a single column with yesod-persistent?
给定一个用户,我正在尝试 select 与用户所在组织相关的事件列表。UserOrg table 描述了哪些 OrgId 对应于给定的 UserId。
我有这些 table:
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 return 的 return 是 [[OrgId]]
而不是 [OrgId]
,concat 在这里不起作用
我做错了吗?在这种情况下我应该只使用 rawQuery
吗?
这是一个好的开始,但我发现其中有很多问题。
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
的同义词)和 returns 一个 OrgId
(同样,Key Org
的同义词)值的列表。但是在您的实施中,您使用的是 liftHandler
、runDB
和 selectList
。这些都是有效的东西!
以下是我编写处理程序的方式。
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")
我是在没有编译器的情况下写的,但它应该是正确的。
给定一个用户,我正在尝试 select 与用户所在组织相关的事件列表。UserOrg table 描述了哪些 OrgId 对应于给定的 UserId。
我有这些 table:
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 return 的 return 是 [[OrgId]]
而不是 [OrgId]
,concat 在这里不起作用
我做错了吗?在这种情况下我应该只使用 rawQuery
吗?
这是一个好的开始,但我发现其中有很多问题。
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
的同义词)和 returns 一个 OrgId
(同样,Key Org
的同义词)值的列表。但是在您的实施中,您使用的是 liftHandler
、runDB
和 selectList
。这些都是有效的东西!
以下是我编写处理程序的方式。
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")
我是在没有编译器的情况下写的,但它应该是正确的。