Skip to content

Many-to-many Relations

So far we have only created One-to-many relationships between the Blog_Category, the Blog_Article and the User types. To implement the feature that we can assign individual users to different categories, we need a Many-to-many relationship.

Instructions

To add a Many-to-many relationship in Slicknode, we can use the same @relation directive that we used for the One-to-many relationship. We only need to add one additional hop. When each category can have multiple users and vice versa, we need an intermediate type that stores the information about which user is assigned to which category.

We will name this type Blog_CategoryAuthor and add it to the blog schema:

modules/blog/schema.graphql:

type Blog_CategoryAuthor implements Node {
  id: ID!
  category: Blog_Category!
  user: User!
}

We also want to have the relationship fields on both the Blog_Category and the User type. This works the same as for the previous relations, we only add the additional hop via the Blog_CategoryUser in the path argument of the @relation directive:

type Blog_Category implements Node {
  # ...
  authors: [User!]! @relation(path: "Blog_Category=category.Blog_CategoryAuthor.user=User")
}

extend type User {
  # ...
  Blog_categories: [Blog_Category!]! @relation(path: "User=user.Blog_CategoryAuthor.category=Blog_Category")
}

Now deploy the changes and fix any potential errors:

slicknode deploy

To test your relationship, go to the Slicknode console slicknode console and create a few Blog_CategoryAuthor objects via the data browser.

Then run a few test queries in the playground (slicknode playground), for example load all categories of the currently logged in user:

{
  viewer {
    user {
      Blog_categories {
        edges {
          node {
            id
            name
          }
        }
      } 
    }
  }
}