Haskell 骷髅 3 table 加入
Haskell Esqueleto 3 table join
这些是我尝试从三个表中进行 SELECT 的尝试。但是他们不编译,我不明白这个错误(我不知道为什么它需要一个元组 (Entity Issue, b0)
而不是我认为代码试图得到的三元组)。
尝试 1:
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Handler.Support where
import Import hiding ((==.))
import qualified Database.Esqueleto as E
import Database.Esqueleto ((^.), (==.), (&&.))
import Data.Traversable
getSupportR :: CustomerId -> Handler Html
getSupportR customerId = do
customer_issues_followUps_list <- runDB $
E.select $
E.from $ \(i, f, c) -> do
E.where_ (i ^. IssueCustomerId ==. E.val customerId &&. i ^. IssueId ==. f ^. FollowUpIssueId &&. i ^. IssueCustomerId ==. c ^. CustomerId)
return (i, f, c)
let issues = map listToMaybe . group . sort . fst . unzip $ customer_issues_followUps_list
defaultLayout $ do
setTitle "Your Licenses"
$(widgetFile "support-display")
错误 1:
/home/hhefesto/dev/laurus-nobilis/src/Handler/Support.hs:41:5: error:
• Couldn't match type ‘(ra, rb, rc)’ with ‘(Entity Issue, b0)’
arising from a functional dependency between:
constraint ‘Database.Esqueleto.Internal.Sql.SqlSelect
(E.SqlExpr (Entity Issue), E.SqlExpr (Entity FollowUp),
E.SqlExpr (Entity Customer))
(Entity Issue, b0)’
arising from a use of ‘E.select’
instance ‘Database.Esqueleto.Internal.Sql.SqlSelect
(a3, b3, c) (ra3, rb3, rc3)’
at <no location info>
• In the second argument of ‘($)’, namely
‘E.select
$ E.from
$ \ (i, f, c)
-> do E.where_
(i ^. IssueCustomerId ==. E.val customerId
&&.
i ^. IssueId ==. f ^. FollowUpIssueId
&&. i ^. IssueCustomerId ==. c ^. CustomerId)
return (i, f, c)’
In a stmt of a 'do' block:
customer_issues_followUps_list <- runDB
$ E.select
$ E.from
$ \ (i, f, c)
-> do E.where_
(i ^. IssueCustomerId
==. E.val customerId
&&.
i ^. IssueId
==. f ^. FollowUpIssueId
&&.
i ^. IssueCustomerId
==. c ^. CustomerId)
return (i, f, c)
In the expression:
do customer_issues_followUps_list <- runDB
$ E.select $ E.from $ \ (i, f, c) -> do ...
let issues
= map listToMaybe . group . sort . fst . unzip
$ customer_issues_followUps_list
defaultLayout
$ do setTitle "Your Licenses"
(do ...)
|
41 | E.select $
| ^^^^^^^^^^...
尝试 2:
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Handler.Support where
import Import hiding ((==.))
import qualified Database.Esqueleto as E
import Database.Esqueleto ((^.), (==.), (&&.))
import Data.Traversable
getSupportR :: CustomerId -> Handler Html
getSupportR customerId = do
customer_issues_followUps_list <- runDB $
E.select $
E.from $ \(i `E.InnerJoin` f `E.InnerJoin` c) -> do
E.on (c ^. CustomerId ==. i ^. IssueCustomerId)
E.on (i ^. IssueId ==. f ^. FollowUpIssueId)
E.where_ (i ^. IssueCustomerId ==. E.val customerId)
return (i, f, c)
let issues = map listToMaybe . group . sort . fst . unzip $ customer_issues_followUps_list
defaultLayout $ do
setTitle "Your Licenses"
$(widgetFile "support-display")
错误 2:
/home/hhefesto/dev/laurus-nobilis/src/Handler/Support.hs:40:5: error:
• Couldn't match type ‘(ra, rb, rc)’ with ‘(Entity Issue, b0)’
arising from a functional dependency between:
constraint ‘Database.Esqueleto.Internal.Sql.SqlSelect
(E.SqlExpr (Entity Issue), E.SqlExpr (Entity FollowUp),
E.SqlExpr (Entity Customer))
(Entity Issue, b0)’
arising from a use of ‘E.select’
instance ‘Database.Esqueleto.Internal.Sql.SqlSelect
(a2, b2, c) (ra2, rb2, rc2)’
at <no location info>
• In the second argument of ‘($)’, namely
‘E.select
$ E.from
$ \ (i `E.InnerJoin` f `E.InnerJoin` c)
-> do E.on (c ^. CustomerId ==. i ^. IssueCustomerId)
E.on (i ^. IssueId ==. f ^. FollowUpIssueId)
....’
In a stmt of a 'do' block:
customer_issues_followUps_list <- runDB
$ E.select
$ E.from
$ \ (i `E.InnerJoin` f `E.InnerJoin` c)
-> do E.on
(c ^. CustomerId
==. i ^. IssueCustomerId)
E.on
(i ^. IssueId
==. f ^. FollowUpIssueId)
....
In the expression:
do customer_issues_followUps_list <- runDB
$ E.select
$ E.from
$ \ (i `E.InnerJoin` f `E.InnerJoin` c)
-> do ...
let issues
= map listToMaybe . group . sort . fst . unzip
$ customer_issues_followUps_list
defaultLayout
$ do setTitle "Your Licenses"
(do ...)
|
40 | E.select $
| ^^^^^^^^^^...
这是我的 Persistent 模型:
Customer
email Text
password Text
firstName Text
lastName Text
address1 Text
address2 Text
city Text
state Text
zipCode Text
country Text
phone Text
organization Text
UniqueCustomer email
deriving Typeable
deriving Show
deriving Eq
deriving Ord
License
licenseAlias Text
expirationDate UTCTime
assignedTo CustomerId
customerId CustomerId
deriving Show
deriving Eq
deriving Ord
Issue
customerId CustomerId
issueSummary Text
issueDetails Text
issueState Int
issueDate UTCTime
deriving Show
deriving Eq
deriving Ord
FollowUp
issueId IssueId
followUpDate UTCTime
followUpAuthor CustomerId
followUpText Text
deriving Show
deriving Eq
deriving Ord
-- Soon to be deleted:
Email
email Text
customerId CustomerId Maybe
verkey Text Maybe
UniqueEmail email
Comment json -- Adding "json" causes ToJSON and FromJSON instances to be derived.
message Text
customerId CustomerId Maybe
deriving Eq
deriving Show
如您所见,两次尝试的错误是相同的:它需要一个元组而不是三元组。
任何帮助将不胜感激:)
罪魁祸首在 let
语句中:
let issues = map listToMaybe . group . sort . fst . unzip $ customer_issues_followUps_list
fst
和 unzip
使用元组,因此编译器暗示 customer_issues_followUps_list
是一个元组。
要解决这个问题,只需将“-extra”添加到您的 package.yml 依赖项(或您的 cabal 文件),并将 fst
和 unzip
替换为 fst3
和 unzip3
在 let
语句中像这样:
let issues = map listToMaybe . group . sort . fst3 . unzip3 $ customer_issues_followUps_list
这些是我尝试从三个表中进行 SELECT 的尝试。但是他们不编译,我不明白这个错误(我不知道为什么它需要一个元组 (Entity Issue, b0)
而不是我认为代码试图得到的三元组)。
尝试 1:
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Handler.Support where
import Import hiding ((==.))
import qualified Database.Esqueleto as E
import Database.Esqueleto ((^.), (==.), (&&.))
import Data.Traversable
getSupportR :: CustomerId -> Handler Html
getSupportR customerId = do
customer_issues_followUps_list <- runDB $
E.select $
E.from $ \(i, f, c) -> do
E.where_ (i ^. IssueCustomerId ==. E.val customerId &&. i ^. IssueId ==. f ^. FollowUpIssueId &&. i ^. IssueCustomerId ==. c ^. CustomerId)
return (i, f, c)
let issues = map listToMaybe . group . sort . fst . unzip $ customer_issues_followUps_list
defaultLayout $ do
setTitle "Your Licenses"
$(widgetFile "support-display")
错误 1:
/home/hhefesto/dev/laurus-nobilis/src/Handler/Support.hs:41:5: error:
• Couldn't match type ‘(ra, rb, rc)’ with ‘(Entity Issue, b0)’
arising from a functional dependency between:
constraint ‘Database.Esqueleto.Internal.Sql.SqlSelect
(E.SqlExpr (Entity Issue), E.SqlExpr (Entity FollowUp),
E.SqlExpr (Entity Customer))
(Entity Issue, b0)’
arising from a use of ‘E.select’
instance ‘Database.Esqueleto.Internal.Sql.SqlSelect
(a3, b3, c) (ra3, rb3, rc3)’
at <no location info>
• In the second argument of ‘($)’, namely
‘E.select
$ E.from
$ \ (i, f, c)
-> do E.where_
(i ^. IssueCustomerId ==. E.val customerId
&&.
i ^. IssueId ==. f ^. FollowUpIssueId
&&. i ^. IssueCustomerId ==. c ^. CustomerId)
return (i, f, c)’
In a stmt of a 'do' block:
customer_issues_followUps_list <- runDB
$ E.select
$ E.from
$ \ (i, f, c)
-> do E.where_
(i ^. IssueCustomerId
==. E.val customerId
&&.
i ^. IssueId
==. f ^. FollowUpIssueId
&&.
i ^. IssueCustomerId
==. c ^. CustomerId)
return (i, f, c)
In the expression:
do customer_issues_followUps_list <- runDB
$ E.select $ E.from $ \ (i, f, c) -> do ...
let issues
= map listToMaybe . group . sort . fst . unzip
$ customer_issues_followUps_list
defaultLayout
$ do setTitle "Your Licenses"
(do ...)
|
41 | E.select $
| ^^^^^^^^^^...
尝试 2:
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Handler.Support where
import Import hiding ((==.))
import qualified Database.Esqueleto as E
import Database.Esqueleto ((^.), (==.), (&&.))
import Data.Traversable
getSupportR :: CustomerId -> Handler Html
getSupportR customerId = do
customer_issues_followUps_list <- runDB $
E.select $
E.from $ \(i `E.InnerJoin` f `E.InnerJoin` c) -> do
E.on (c ^. CustomerId ==. i ^. IssueCustomerId)
E.on (i ^. IssueId ==. f ^. FollowUpIssueId)
E.where_ (i ^. IssueCustomerId ==. E.val customerId)
return (i, f, c)
let issues = map listToMaybe . group . sort . fst . unzip $ customer_issues_followUps_list
defaultLayout $ do
setTitle "Your Licenses"
$(widgetFile "support-display")
错误 2:
/home/hhefesto/dev/laurus-nobilis/src/Handler/Support.hs:40:5: error:
• Couldn't match type ‘(ra, rb, rc)’ with ‘(Entity Issue, b0)’
arising from a functional dependency between:
constraint ‘Database.Esqueleto.Internal.Sql.SqlSelect
(E.SqlExpr (Entity Issue), E.SqlExpr (Entity FollowUp),
E.SqlExpr (Entity Customer))
(Entity Issue, b0)’
arising from a use of ‘E.select’
instance ‘Database.Esqueleto.Internal.Sql.SqlSelect
(a2, b2, c) (ra2, rb2, rc2)’
at <no location info>
• In the second argument of ‘($)’, namely
‘E.select
$ E.from
$ \ (i `E.InnerJoin` f `E.InnerJoin` c)
-> do E.on (c ^. CustomerId ==. i ^. IssueCustomerId)
E.on (i ^. IssueId ==. f ^. FollowUpIssueId)
....’
In a stmt of a 'do' block:
customer_issues_followUps_list <- runDB
$ E.select
$ E.from
$ \ (i `E.InnerJoin` f `E.InnerJoin` c)
-> do E.on
(c ^. CustomerId
==. i ^. IssueCustomerId)
E.on
(i ^. IssueId
==. f ^. FollowUpIssueId)
....
In the expression:
do customer_issues_followUps_list <- runDB
$ E.select
$ E.from
$ \ (i `E.InnerJoin` f `E.InnerJoin` c)
-> do ...
let issues
= map listToMaybe . group . sort . fst . unzip
$ customer_issues_followUps_list
defaultLayout
$ do setTitle "Your Licenses"
(do ...)
|
40 | E.select $
| ^^^^^^^^^^...
这是我的 Persistent 模型:
Customer
email Text
password Text
firstName Text
lastName Text
address1 Text
address2 Text
city Text
state Text
zipCode Text
country Text
phone Text
organization Text
UniqueCustomer email
deriving Typeable
deriving Show
deriving Eq
deriving Ord
License
licenseAlias Text
expirationDate UTCTime
assignedTo CustomerId
customerId CustomerId
deriving Show
deriving Eq
deriving Ord
Issue
customerId CustomerId
issueSummary Text
issueDetails Text
issueState Int
issueDate UTCTime
deriving Show
deriving Eq
deriving Ord
FollowUp
issueId IssueId
followUpDate UTCTime
followUpAuthor CustomerId
followUpText Text
deriving Show
deriving Eq
deriving Ord
-- Soon to be deleted:
Email
email Text
customerId CustomerId Maybe
verkey Text Maybe
UniqueEmail email
Comment json -- Adding "json" causes ToJSON and FromJSON instances to be derived.
message Text
customerId CustomerId Maybe
deriving Eq
deriving Show
如您所见,两次尝试的错误是相同的:它需要一个元组而不是三元组。
任何帮助将不胜感激:)
罪魁祸首在 let
语句中:
let issues = map listToMaybe . group . sort . fst . unzip $ customer_issues_followUps_list
fst
和 unzip
使用元组,因此编译器暗示 customer_issues_followUps_list
是一个元组。
要解决这个问题,只需将“-extra”添加到您的 package.yml 依赖项(或您的 cabal 文件),并将 fst
和 unzip
替换为 fst3
和 unzip3
在 let
语句中像这样:
let issues = map listToMaybe . group . sort . fst3 . unzip3 $ customer_issues_followUps_list