Присоединяйся к Maybe Fields

У меня есть таблица с возможно внешним ключом. Я пытаюсь присоединиться, но не могу его скомпилировать.

CatTable
   name Text

MyTable
   category CatTableId Maybe
   amount Double    

Мой запрос:

myQuery :: (PersistQuery (SqlPersistT m), MonadLogger m , MonadResourceBase m) =>
                        SqlPersistT m [(E.Value (Maybe (Text)), E.Value (Maybe Double))]
myQuery = do
  E.select $ E.from $  \(t `E.LeftOuterJoin` c) -> do
        E.on (t E.?. MyTableCategory E.==. E.just (c E.^. CatTableId))
        E.groupBy $ E.just (c E.^. CatTableName)
        let sum' = E.sum_ (t E.^. MyTableAmount)
        E.orderBy [E.desc sum']
        return (E.just (c E.^. CatTableName) , sum' )

и я получаю эту ошибку типа:

Couldn't match type `KeyBackend SqlBackend CatTable'
              with `Maybe (KeyBackend SqlBackend CatTable)'
Expected type: EntityField
                 CatTable (Maybe (KeyBackend SqlBackend CatTable))
  Actual type: EntityField
                 CatTable (KeyBackend SqlBackend CatTable)
In the second argument of `(^.)', namely `CatTableId'
In the first argument of `just', namely `(c ^. CatTableId)'
In the second argument of `(E.==.)', namely
  `just (c ^. CatTableId)'

Couldn't match type `Maybe (Entity MyTable)' with `Entity MyTable'
Expected type: SqlExpr (Entity MyTable)
  Actual type: SqlExpr (Maybe (Entity MyTable))
In the first argument of `(^.)', namely `t'
In the first argument of `sum_', namely `(t ^. MyTableAmount)'
In the expression: sum_ (t ^. MyTableAmount)

Я пробовал разные комбинации ^. а также ?. но не повезло. Также попытался удалить или добавить just тоже. На данный момент об этом я просто догадываюсь, не понимая, как устранить ошибку. Так что оцените любой вклад о том, как присоединиться на поле Maybe. Я предполагаю groupBy вероятно, усложняет это, поскольку это не может быть в CatTable, но это будет, как только он будет присоединен.

 select * from cat_table;
 id|name
 1|A
 2|B
 3|C

 select * from my_table;
 id|category|amount
 1|1|55.0
 2|1|15.0
 3|2|10.0
 4|2|60.0
 5||60.0


select name, sum(amount) from my_table as m left join cat_table as c
       on m.category = c.id 
       group by name;


|60.0
A|70.0
B|70.0

1 ответ

Решение

Этот запрос работает. Разница между запросом, который я разместил в своем вопросе, и этот действительно ?. Я думал, что попробовал этот вариант, но, возможно, пропустил очевидное. Я до сих пор неясно, когда мы будем использовать ?. хоть., Я заметил, что я также получаю рабочий запрос, если удалить E.just и использовал ?. для CatTable Entity (c),

myQuery :: (PersistQuery (SqlPersistT m), MonadLogger m , MonadResourceBase m) =>
                        SqlPersistT m [(E.Value (Maybe Text), E.Value (Maybe Double))]
myQuery = do
  E.select $ E.from $  \(t `E.LeftOuterJoin` c) -> do
        E.on (t E.^. MyTableCategory E.==. E.just (c E.^. CatTableId))
        E.groupBy $ E.just (c E.^. CatTableName)
        let sum' = E.sum_ (t E.^. MyTableAmount)
        E.orderBy [E.desc sum']
        return (E.just (c E.^. CatTableName) ,sum')
Другие вопросы по тегам