Ben
Ben

Reputation: 1581

How to get related fields (foreign key) in Yesod?

I've defined the following models in Yesod application:

CvCategory
    title Text
    order Int
    UniqueCvCategory title

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

I have the following query in a handler:

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

In my hamlet template, I'd like to do something like:

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

In Django, you can easily define a related_name, and then use this to easily access all 'child objects'. Is this possible in Yesod too? How?

Upvotes: 1

Views: 156

Answers (1)

arrowd
arrowd

Reputation: 34401

Change your query, something like

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

And then your Hamlet would look like

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

Upvotes: 2

Related Questions