database - 在 Maybe 关系上运行 join

标签 database haskell yesod persistent esqueleto

我有一个模型

Assignment
   blah Text
   ....

和一个模型

File
    assignmentId AssignmentId Maybe
    ...

并且我想获取与连接查询中的分配关联的所有文件。我已经尝试过 Esqueleto 和 runJoinselectOneMany 但没有任何运气,所以我正在考虑不使用连接或使用 rawSql。这看起来确实不是个好主意,但我想不通。是否支持该功能?

最佳答案

更新,工作示例:

{-# LANGUAGE PackageImports, OverloadedStrings, ConstraintKinds #-}
module Handler.HTest where

import Import
import "esqueleto" Database.Esqueleto as Esql
import "monad-logger" Control.Monad.Logger (MonadLogger)
import "resourcet" Control.Monad.Trans.Resource (MonadResourceBase)
import qualified Data.List as L

getFilesByAssignment :: (PersistQuery (SqlPersist m), MonadLogger m
                                                  , MonadResourceBase m) =>
                        Text -> SqlPersist m [Entity File]
getFilesByAssignment myAssign = do
  result <- select $
        from $ \(assign `InnerJoin` file) -> do
          on (just (assign ^. AssignmentId)
            Esql.==. file ^. FileAssignmentId)
          where_ (assign ^. AssignmentBlah Esql.==. val myAssign)
          return (assign, file)

  return $ map snd (result :: [(Entity Assignment, Entity File)])

(.$) = flip ($)

getTestR :: Handler RepHtml
getTestR = do
       entFiles <- runDB $ getFilesByAssignment "test"
       defaultLayout $ do
               setTitle "Test page"
               entFiles .$ map (show . unKey . entityKey)
                        .$ L.intercalate ", "
                        .$ toHtml
                        .$ toWidget

关于database - 在 Maybe 关系上运行 join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15603927/

相关文章:

haskell - 如何避免哈姆雷特模板中标签(链接)后的空格?

C# 编程创建的按钮 - 启用以编程方式创建的文本框

haskell - 每种类型都有独特的变质吗?

python - 使用 python 访问 PostgreSQL 数据库的安全方法

haskell - 已知缓存的功能替代方案 "answers"

用于多重调用函数的Haskell尾递归

haskell - 在 Yesod 中强制 Julius 重新插值或如何避免在客户端密集型应用程序中对服务器进行双重标记

yesod - 在没有 GHC 和 cabal 的情况下运行 Keter

java - 数据库 vs Solr vs 图形 DB(Neo4j)

java - 在 Java 中下拉搜索窗口