2017-10-03 5 views
1

Je peux changer un champ d'une ligne avec entryId dans Esqueleto comme ceci:Mettre à jour une ligne avec ID spécifique dans Esqueleto

update $ \entry -> do 
    set entry [ EntryFoo =. val bar ] 
    where_ (entry ^. EntryId ==. val entryId) 

Cependant, écrire tout le temps devient ennuyeux. Je voudrais pouvoir écrire quelque chose comme ceci:

updateById entryId $ \entry -> 
    set entry [ EntryFoo =. val bar ] 

J'ai essayé d'écrire cette aide par moi-même, mais a constaté que je ne sais pas comment écrire ^. EntryId de manière générique (par exemple d'une manière qui fonctionnerait pour tous les types d'entrée). C'est possible? Ou suis-je manquer quelque chose et updateById existe déjà dans Esqueleto?

Répondre

0

Pour toute Entity, ^. EntityId peut être écrit comme ^. persistIdField (le champ persistIdField est une méthode de la classe PersistEntity). Ainsi, votre fonction peut être écrite comme ceci:

updateById 
    :: (E.PersistEntityBackend val ~ E.SqlBackend, 
     MonadIO m, E.PersistEntity val) 
    => Key val 
    -> (E.SqlExpr (E.Entity val) -> E.SqlQuery a) 
    -> E.SqlWriteT m() 
updateById entryId upd = E.update $ \entry -> do 
    upd entry 
    E.where_ (entry E.^. E.persistIdField ==. E.val entryId) 
0

Je suis certainement pas un expert en esqueleto, mais je dirais:

updateById entryId upd = update $ \entry -> do 
          upd entry 
          where_ (entry ^. EntryId ==. val entryId) 

devrait résoudre le problème.

+0

Bien sûr, cela résout le problème pour une table particulière ('Entry'), mais je veux une solution qui fonctionnerait pour n'importe quelle table. C'est à dire. J'ai besoin de 'updateById :: Key a -> _ -> _', alors que votre fonction est' updateById :: Key Entry -> _ -> _'. – Artyom