Relationships

How to define and use relationships between tables.

Relationships

Nuxt Auto CRUD leverages Drizzle ORM's powerful relationship capabilities. By defining relationships in your schema, you can enable deep fetching and maintain data integrity.

Defining Relationships

You define relationships in your schema files using Drizzle's relations helper.

Example: Role-Based Access Control

Here is how the internal RBAC system links Roles, Resources, and Permissions.

// server/database/schema/permissions.ts
import { relations } from 'drizzle-orm'
import { sqliteTable, integer, text } from 'drizzle-orm/sqlite-core'

// 1. Define Tables
export const roles = sqliteTable('roles', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  name: text('name').notNull().unique(),
})

export const resources = sqliteTable('resources', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  name: text('name').notNull().unique(),
})

export const permissions = sqliteTable('permissions', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  name: text('name').notNull().unique(), 
  // e.g., 'create', 'read', 'update', 'delete'
})

// The join table
export const roleResourcePermissions = sqliteTable('role_resource_permissions', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  roleId: integer('role_id').references(() => roles.id),
  resourceId: integer('resource_id').references(() => resources.id),
  permissionId: integer('permission_id').references(() => permissions.id),
})

// 2. Define Relations
export const roleResourcePermissionsRelations = relations(roleResourcePermissions, ({ one }) => ({
  role: one(roles, {
    fields: [roleResourcePermissions.roleId],
    references: [roles.id],
  }),
  resource: one(resources, {
    fields: [roleResourcePermissions.resourceId],
    references: [resources.id],
  }),
  permission: one(permissions, {
    fields: [roleResourcePermissions.permissionId],
    references: [permissions.id],
  }),
}))

Benefits

  • Data Integrity: Foreign keys (defined in the table columns) ensure valid references.
  • Query Power: You can use Drizzle's query builder (e.g., in custom API endpoints) to fetch related data easily using with: { ... }.