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.
You define relationships in your schema files using Drizzle's relations helper.
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],
}),
}))
with: { ... }.