1

私はモデルを持っています

Assignment
   blah Text
   ....

とモデル

File
    assignmentId AssignmentId Maybe
    ...

結合クエリで割り当てに関連付けられているすべてのファイルを取得したいと思います。私はEsqueletoを試しましrunJoinselectOneManyが、運がなかったので、結合を使用しないか、rawSqlを使用することを検討しています。それは本当に良い考えではないようですが、私はこれを理解することはできません。その機能のサポートはありますか?

4

1 に答える 1

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
于 2013-03-25T11:03:40.600 に答える