【问题标题】:How to get related fields (foreign key) in Yesod?如何在Yesod中获取相关字段(外键)?
【发布时间】:2018-11-29 08:17:30
【问题描述】:

我在 Yesod 应用程序中定义了以下模型:

CvCategory
    title Text
    order Int
    UniqueCvCategory title

CvItem
    category CvCategoryId
    title Text
    fromYear Int
    toYear Int Maybe
    description Text Maybe
    UniqueCvItem title

我在处理程序中有以下查询:

cvcategories <- selectList [] [] --all cv categories

在我的小村庄模板中,我想做类似的事情:

<ul>
$forall cvcategory <- cvcategories
    <li>$#{cvCategoryTitle cvcategory}
         $forall cvitem <- cvcategory --how?
         <li>#{cvItemTitle cvitem}

在 Django 中,您可以轻松定义 related_name,然后使用它轻松访问所有“子对象”。 Yesod也有可能吗?怎么样?

【问题讨论】:

    标签: sql haskell yesod persistent hamlet


    【解决方案1】:

    更改您的查询,例如

    do
      cvcategories <- selectList [] [] --all cv categories
      forM cvcategories $ \cat -> do -- for each category
        cvitems <- selectList [CvCategoryId .== entityKey cat] -- all items belonging to it
        return (cat, cvitems) -- return tuple of category and its items
    

    然后你的哈姆雷特看起来像

    <ul>
    $forall (cvcategory, cvitems) <- cvcategories
        <li>$#{cvCategoryTitle cvcategory}
             $forall cvitem <- items
             <li>#{cvItemTitle cvitem}
    

    【讨论】:

    • 这行得通,谢谢!没有更优雅的方式吗,比如在 Django 中如何定义它(使用相关名称,您可以直接在模板中使用)?
    • 那里有什么不雅点?查询应该定义您从数据库中获取的内容。从我的观点来看,Django 的 related_name 东西模糊了业务逻辑和持久层之间的界限。但也许我只是错过了一些东西,对 Django 的经验是 0。
    • 方便可能是一个更好的词。从某种意义上说,您肯定是对的,尽管这是一种常见的模式,以至于每次需要时都显式地编写查询有点麻烦。
    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 2015-08-16
    • 2018-02-24
    相关资源
    最近更新 更多