【问题标题】:Get by ID with Persistent [duplicate]通过 ID 获取持久性 [重复]
【发布时间】:2015-05-14 23:00:42
【问题描述】:

我是 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 查询我的表。

【问题讨论】:

  • 你看过 Yesod Web Framework Book 的 Persistent 页面了吗? yesodweb.com/book/persistent
  • @zigazou 正如我在我的问题中所链接的那样,是的。
  • 我也是 Persistent 和 Yesod 的新手。这个页面帮助我了解它是如何工作的。您能否更准确地说明是什么阻碍了您?你试过脚手架网站吗?
  • @Cubic close,但这个问题是 Yesod 特定的
  • @LuxuryMode 不是。 Yesod在标题中,但它是关于Persist的,答案与Yesod无关。

标签: haskell yesod


【解决方案1】:

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

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 在我的 URL 中只接受 ArticleId 作为第二个参数。 Article*R 只是每个 URL 的处理程序。

在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")

这基本上就是你如何链接每个部分。

【讨论】:

  • 这很有帮助,谢谢!但是,我没有使用 Yesod。我在 Web 端将 Persistent 与 Scotty 一起用作独立的 ORM。
猜你喜欢
  • 2014-06-27
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
相关资源
最近更新 更多