2013-03-24 57 views
1

加入我有一个模型上运行也许关系

Assignment 
    blah Text 
    .... 

和模型

File 
    assignmentId AssignmentId Maybe 
    ... 

,我想有一个分配的连接查询相关联的所有文件。我已经试过Esqueleto和runJoinselectOneMany,但没有任何运气,所以我正在考虑不使用连接,或使用rawSql。这真的不是一个好主意,但我无法弄清楚这一点。有没有对该功能的支持?

+1

你或许应该包括与你得到的错误消息esqueleto和runJoin代码,你试过了,在一起。 – 2013-03-25 04:50:01

+0

更新:下面编译的例子。 – 2013-03-26 11:52:07

回答

2

更新,工作示例:

{-# 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 
+0

我放弃了并使用rawSql,但我一定会在将来再次提到这一点。谢谢。 – 2013-04-07 01:36:46