gpt4 book ai didi

haskell - selectOneMany Yesod 持久

转载 作者:行者123 更新时间:2023-12-02 11:57:44 29 4
gpt4 key购买 nike

我试图让 selectOneMany 取得有限的成功。

我有以下数据库模型

User
email Text
verkey Text Maybe
verified Bool
password Text Maybe
UniqueUser email
date UTCTime
deriving Show

Competence
parent CompetenceId Maybe
title Text
UniqueCompetence title
deriving Show Read

UserCompetence
competence CompetenceId
user UserId Eq
UniqueUserCompetence user competence
deriving Show Read

来 self 的处理程序的代码

mmember <- runMaybeT $ do
id <- MaybeT $ maybeAuth
user <- MaybeT . runDB . get . entityKey $ id
Entity memberId member <- MaybeT . runDB . getBy . UniqueMember . userEmail $ user
competences <- lift . runDB . runJoin $ (selectOneMany (UserCompetenceUser <-.) userCompetenceUser)
return (member,competences)

第一个;我无法在不添加大类型签名的情况下运行此代码,这是应该的吗?

competences <- lift . runDB . runJoin $ (selectOneMany (UserCompetenceUser <-.) userCompetenceUser :: SelectOneMany SqlPersist (UserGeneric SqlPersist) (UserCompetenceGeneric SqlPersist))

其次;能力的类型是什么。理想情况下,我希望最终获得[实体能力Id能力]。

最后;如何向上述连接添加过滤器以便仅获取“用户”的权限?

最佳答案

我已经告诉过你,由于 SelectOneMany ,不可能避免额外的类型签名。使用可能不归纳的类型别名;也就是说,您的代码试图变得比应有的多态性更强,并且类型签名对于限制这种多态性是必要的。

您可以通过“从不同角度”限制类型来避免使用巨大的签名,例如:

return (member, competences :: [(Entity User, [Entity UserCompetence])])

由于类型别名 UserUserCompetence选择特定的数据库后端,应适当解析类型。

另外,我刚刚破坏了 competences 的类型为你。哈!我希望这对你来说已经足够了。如果您想要直接进行多对多三表连接,以便获得用户“拥有”的所有权限,那么您应该使用准备好的语句,因为潜在的 AST 开销,因此请查看 the generic raw SQL interface它可以让你做传统的"SELECT * FROM foo WHERE bar = ?" [filteredBarValue]您可能更习惯使用它;它不提供与 persistent 的其余部分相同的类型安全性但我认为这是在您的情况下实现三表联接的最简单方法。

您可以限制 User通过修改 oneFilterMany 的结果来选择的其类型为 OneFilterMany 。像这样(还没有测试过,但应该可以):

let join = (selectOneMany (UserCompetenceUser <-.) userCompetenceUser)
{ somFilterOne = [... filters for User ...] }
competences <- lift . runDB . runJoin $ join

关于haskell - selectOneMany Yesod 持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11570800/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com