yesod 持久:在小村庄内获取实体值

Posted

技术标签:

【中文标题】yesod 持久:在小村庄内获取实体值【英文标题】:yesod persistent: get Entity value within hamlet 【发布时间】:2013-02-01 02:14:03 【问题描述】:

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

Pet
    name Text
    owner OwnerId
Owner
    name Text

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

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

但是我如何从宠物实体获得主人的名字?

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

 <span>#ownerName $ foo $ petOwner pet

【问题讨论】:

【参考方案1】:

Yesod 不会像(例如)rails 那样为关系构建函数,所以你必须自己编写这种东西。

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

请注意,这会在 Handler 中返回(它必须是由于需要数据库查询),这意味着您不能将它直接用作插值中的 foo

从字面上看,从模板中执行该操作正是您期望能够做到的。我要强调的是,这通常是一种设计气味,我建议您重组事物,以便您在处理程序中预先执行所有数据库查询,然后将模板需要的任何(纯)值直接传递给它。例如,您可以构建并传入 [(Pet,Owner)][(Owner, [Pet])]

我的一个站点中有一些helpers,它们抽象了查询数据库中一对多关系的常用方法并返回像(parent, child) 这样的元组列表,我发现这是最有用的方法。

希望这会有所帮助。

【讨论】:

以上是关于yesod 持久:在小村庄内获取实体值的主要内容,如果未能解决你的问题,请参考以下文章

使用持久键列表选择 (Yesod)

Yesod 数据库持久记录访问

Yesod/Persistent 实体派生 Show

如何使用symfony获取Doctrine实体持久集合数据值

如何从 Yesod 的 Persistent 中获取原始键值?

如何让 yesod-persistent 识别我的 aeson 解析实体数组的类型?