2013-03-24 22 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