我是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查询我的表。
答案 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")
这基本上就是你如何链接每一件作品。