yesod persistent:获取hamlet中的Entity值

时间:2013-02-01 02:14:04

标签: haskell persistent yesod hamlet

假设我的配置/模型文件如下所示:

Pet
    name Text
    owner OwnerId
Owner
    name Text

我可以得到这样的宠物名字:

 $forall Entity key pet <- pets
     <span>#{petName pet} 

但我如何从宠物实体获得所有者的名字?

换句话说,foo应该包含以下内容:

 <span>#{ownerName $ foo $ petOwner pet}

1 个答案:

答案 0 :(得分:4)

Yesod不会像关系那样为关系构建函数,所以你必须自己编写这类东西。

-- just one naive example
petOwnerName :: Pet -> Handler (Maybe Text)
petOwnerName p = do
    mo <- runDB $ get (petOwner p)
    return $ fmap ownerName mo

请注意,这在Handler中返回(并且必须由于需要DB查询),这意味着您无法在插值中直接将其用作foo

从字面上看你的例子,从模板中执行该操作正是你期望能够做到的。我要强调的是,这通常是一种设计气味,我建议你重新组织一些东西,这样你就可以在Handler中执行所有db查询,然后将模板直接需要的任何(纯)值传递给它。例如,您可以构建并传递[(Pet,Owner)][(Owner, [Pet])]

我的一个网站中有一些helpers,它提取了查询数据库以获得一对多关系的常用方法,并获取了(parent, child)这样的元组列表我发现它是最有用的方法。

希望这有帮助。