2013-03-24 7 views
1

У меня есть модельRunning присоединиться на Maybe Relation

Assignment 
    blah Text 
    .... 

и модель

File 
    assignmentId AssignmentId Maybe 
    ... 

и я хочу, чтобы получить все файлы, связанные с назначением в запросе с соединением. Я пробовал Esqueleto и runJoin с selectOneMany, но мне не повезло, поэтому я не рассматриваю возможность использования соединения или использования rawSql. Это действительно не очень хорошая идея, но я не могу понять это. Есть ли поддержка для этой функции?

+1

Вы, вероятно, должны включать в себя esqueleto и runJoin код, который вы пытались вместе с сообщениями об ошибках, которые вы получили. –

+0

Обновлено: пример, который компилируется ниже. –

ответ

2

Update, работая, например:

{-# 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, но я обязательно вернусь к этому в будущем. Благодарю. –