3

假设我的 config/models 文件如下所示:

Pet
    name Text
    owner OwnerId
Owner
    name Text

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

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

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

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

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

1 回答 1

4

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

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

请注意,这会在 Handler 中返回(并且它必须是由于所需的 DB 查询),这意味着您不能直接将其用作foo插值。

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

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

希望这可以帮助。

于 2013-02-01T20:27:59.840 回答