2016-04-04 4 views
0

Ich bin mit einigen Problemen beim Erstellen einer Verknüpfung, die eine maybe foreign key verwendet.Haskell Esqueleto - Vielleicht Keys binden nicht auf LeftOuterJoin

Meine Models:

OrderItem 
    productSnapshot ProductSnapshotId 

ProductFlow 
    productInstance ProductInstanceId 
    orderItem OrderItemId Maybe 

ProductSnapshot 
    productInstance ProductInstanceId 

ProductInstance 
    code Text 

Und mein verbindet:

type Entities = [(Entity OrderItem, Entity ProductSnapshot, Entity ProductInstance, Maybe (Entity ProductFlow))] 

loadEntities :: OrderItemId -> Handler Entities 
loadEntities oiId = runDB 
    $ E.select 
    $ E.from $ \(oi `E.InnerJoin` ps `E.InnerJoin` pi `E.LeftOuterJoin` pf) -> do 
    E.on $ pf E.?. ProductFlowOrderItem E.==. E.just (oi ^. OrderItemId) 
    E.on $ pi ^. ProductInstanceId E.==. ps ^. ProductSnapshotProductInstance 
    E.on $ ps ^. ProductSnapshotId E.==. oi ^. OrderItemProductSnapshot 
    E.where_ (oi ^. OrderItemId E.==. E.val oiId) 
    return (oi, ps, pi, pf) 

Ich habe versucht, die Esqueleto oben zeigte join, aber ich habe den folgenden Fehler:

Couldn't match type ‘Key OrderItem’ with ‘Maybe (Key OrderItem)’ 
    Expected type: EntityField OrderItem (Maybe (Key OrderItem)) 
     Actual type: EntityField OrderItem (Key OrderItem) 
    In the second argument of ‘(^.)’, namely ‘OrderItemId’ 
    In the first argument of ‘E.just’, namely ‘(oi ^. OrderItemId)’ 

ich denke, es wird verursacht, weil ich einen vielleicht fremden Schlüssel verwende. Ich habe es auf andere Arten versucht und seltsame Typfehler bekommen. Ich denke, ich verstehe nicht ganz genau, wie diese Verbindungen funktioniert, so eine kurze Erklärung über E.^., E.just und E.?. würde meine Esqueleto Verwendung verbessern.

Antwort

0

ich es geschafft, das Problem zu verstehen und es selbst zu lösen, statt

E.on $ pf E.?. ProductFlowOrderItem E.==. E.just (oi ^. OrderItemId) 

Verwendung dieses

E.on $ pf E.?. ProductFlowOrderItem E.==. (E.just . E.just) (oi ^. OrderItemId) 

Es ist notwendig, die Typen passen zu machen, weil wir E.?. mit einem bereits verwenden Maybe Wert, so müssen wir die richtige Seite ein Maybe (Maybe AType) machen, sonst wäre es falsch, und um es zu machen, habe ich einfach E.just . E.just verwendet, die zwei Mal wickeln wird.