假设我的 config/models 文件如下所示:
Pet
name Text
owner OwnerId
Owner
name Text
我可以像这样得到宠物的名字:
$forall Entity key pet <- pets
<span>#{petName pet}
但是我如何从宠物实体那里获得主人的名字呢?
换句话说,应该foo
是以下内容:
<span>#{ownerName $ foo $ petOwner pet}
假设我的 config/models 文件如下所示:
Pet
name Text
owner OwnerId
Owner
name Text
我可以像这样得到宠物的名字:
$forall Entity key pet <- pets
<span>#{petName pet}
但是我如何从宠物实体那里获得主人的名字呢?
换句话说,应该foo
是以下内容:
<span>#{ownerName $ foo $ petOwner pet}
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)
我发现这是最有用的方法一样。
希望这可以帮助。