使用Persistent获取ID

时间:2015-05-14 13:58:12

标签: haskell yesod

我是Persistent的新手,并试图找出如何使用ID获取行。 docs show an example看起来像这样:

personId <- insert $ Person "Michael" "Snoyman" 26
maybePerson <- get personId
case maybePerson of
    Nothing -> liftIO $ putStrLn "Just kidding, not really there"
    Just person -> liftIO $ print person

此示例使用从插入生成的ID来执行查询。我不完全理解它是如何工作的,但这里的想法是有类型安全键,因此无法使用BarID查询Foo。

如何为我的特定实体生成类型安全ID /密钥?我希望能够从某个url路径获取Int,然后使用它作为ID查询我的表。

1 个答案:

答案 0 :(得分:1)

例如,假设我的Article文件中有models

Article
    artname     Text
    title       Text
    keywords    Text Maybe
    description Text Maybe
    body        Markdown
    parent      ArticleId Maybe
    user        UserId
    lastUpdate  UTCTime
    weight      Int
    public      Bool

    UniqueArt   artname

    deriving    Typeable

我不需要创建主键articleId,因为它由Persistent处理。

在我的routes文件中:

/new/page                       ArticleNewR GET POST
/page/#ArticleId/edit           ArticleEditR GET POST
/page/#ArticleId/delete         ArticleDeleteR GET POST
/page/#ArticleId                ArticleViewR GET

#ArticleId告诉Yesod仅在我的网址中接受ArticleId作为第二个参数。 Article*R只是每个网址的处理程序。

Handler/Article.hs中,我需要有相应的函数处理程序。例如,如果我告诉Yesod ArticleViewR GET处理程序,我需要定义以下函数:

getArticleViewR :: ArticleId -> Handler Html
getArticleViewR articleId = do
    -- The article
    article <- runDB $ get404 articleId

    -- The parent article (if any)
    let parentIdM = articleParent article
    parentM <- case parentIdM of
                    Just parentId -> runDB $ get parentId
                    Nothing -> return Nothing

    -- The child articles
    children <- runDB $ selectList [ArticleParent ==. Just articleId]
                                   [Asc ArticleWeight, Asc ArticleTitle]

    -- Author
    author <- runDB $ get (articleUser article)

    defaultLayout $ do
        setTitle $ toHtml (articleTitle article)
        setDescription $ articleDescription article
        setKeywords $ articleKeywords article
        setAuthor $ userUsername <$> author
        $(widgetFile "article/view")

这基本上就是你如何链接每一件作品。