Reference
Database Schema and Models
On this page
- Relationship diagram
- system_roles — model SystemRoles
- system_roles_in — model SystemRolesIn
- user_roles — model UserRoles
- user_roles_history — model UserRoleHistory
- user_roles_in — model UserRolesIn
- system_classes — model SystemClasses
- system_classes_in — model SystemClassesIn
- system_routes — model SystemRoutes
- system_routes_in — model SystemRoutesIn
- Menu tables (experimental)
- system_menus — model SystemMenus
- system_menu_items — model SystemMenuItems
- system_menus_in — model SystemMenusIn
- Useful queries
All foreign keys use ON DELETE RESTRICT and ON UPDATE RESTRICT: a row cannot be deleted while another row points at it. Every model lives in BabeRuka\SystemRoles\Models.
Relationship diagram#
erDiagram
users ||--o| user_roles : "has one"
system_roles ||--o{ user_roles : "user_role"
user_roles ||--o{ user_roles_history : "logged in"
system_roles ||--o{ system_roles_in : "permission matrix"
system_roles_in ||--o{ user_roles_in : "snapshot"
users ||--o{ user_roles_in : ""
system_roles ||--o{ system_classes_in : ""
system_classes ||--o{ system_classes_in : ""
system_roles ||--o{ system_routes_in : ""
system_routes ||--o{ system_routes_in : ""
system_menus ||--o{ system_menu_items : ""
system_menus ||--o{ system_menus_in : ""In words:
system_rolesis the centre. Permissions (system_roles_in), controller access (system_classes_in) and route access (system_routes_in) each have one row per role.user_roleslinks each user to one role. Changes are logged inuser_roles_history.user_roles_incopies a user's permissions when their role is assigned.- The menu tables hang off
system_menusand point atsystem_routesbyroute_id(no foreign key).
system_roles — model SystemRoles#
| Column | Type | Notes |
|---|---|---|
role_ |
bigint unsigned, PK | |
role_ |
varchar(191), unique | Display name |
role_ |
varchar(191), unique | Code name, lower snake case |
role_ |
varchar(255), null | |
role_ |
enum(eng) |
Reserved |
role_ |
enum(RolesController), null |
Reserved |
role_ |
int, null | Sort order |
created_, updated_ |
timestamp |
Relationships: permissions() → many SystemRolesIn; userRoles() → many UserRoles.
system_roles_in — model SystemRolesIn#
The permission matrix. One row per permission per role.
| Column | Type | Notes |
|---|---|---|
in_ |
bigint unsigned, PK | |
role_ |
bigint unsigned, FK → system_ |
|
in_ |
varchar(191) | Permission name. Unique with role_ |
in_ |
varchar(191) | Permission key. Unique with role_ |
in_ |
enum(0,1,2), default 0 |
1 = on |
in_ |
int, null | Display order |
created_, updated_ |
timestamp |
Relationships: role() → SystemRoles; userPermissions() → many UserRolesIn.
user_roles — model UserRoles#
One row per user.
| Column | Type | Notes |
|---|---|---|
role_ |
bigint unsigned, PK | The row id (not the role!) |
user_ |
bigint unsigned, FK → users. |
|
user_ |
bigint unsigned, FK → system_ |
The user's role |
role_ |
int, null | Id of the user who assigned it |
role_ |
varchar(255), null | Free label, system by default |
created_, updated_ |
timestamp |
Relationships: role() → SystemRoles (via user_role); user() → your user model.
Watch the naming: in
user_roles,role_idis the row's own id anduser_roleis the role. UseSystemRolesService::roleIdForUser()to avoid mixing them up.
user_roles_history — model UserRoleHistory#
| Column | Type | Notes |
|---|---|---|
history_ |
bigint unsigned, PK | |
role_ |
int, null | The user_ row id |
user_ |
int, null | |
user_ |
bigint unsigned, null | The role given |
role_ |
int, null | Who gave it |
role_ |
varchar(255), null | |
created_, updated_ |
timestamp |
No foreign keys, so history survives user deletion. Relationships: userRole(), role(), user(). The model has no $fillable; set attributes one by one.
user_roles_in — model UserRolesIn#
Snapshot of a user's permissions when their role was last assigned.
| Column | Type | Notes |
|---|---|---|
perm_ |
bigint unsigned, PK | |
user_ |
bigint unsigned, FK → users. |
|
in_ |
bigint unsigned, FK → system_ |
|
in_ |
int, null | Copied from the matrix |
created_, updated_ |
timestamp |
Relationships: user(), permission() → SystemRolesIn.
system_classes — model SystemClasses#
| Column | Type | Notes |
|---|---|---|
class_ |
bigint unsigned, PK | |
class_ |
varchar(191) | Short class name |
class_ |
varchar(191) | File name |
class_ |
varchar(255), null | Generated |
class_ |
varchar(255) | Unique together with class_ |
created_, updated_ |
timestamp |
Relationship: permissions() → many SystemClassesIn.
system_classes_in — model SystemClassesIn#
| Column | Type | Notes |
|---|---|---|
in_ |
bigint unsigned, PK | |
role_ |
bigint unsigned, FK → system_ |
|
class_ |
bigint unsigned, FK → system_ |
Unique with role_ |
in_ |
enum(0,1,2), default 0 |
1 = granted |
created_, updated_ |
timestamp |
system_routes — model SystemRoutes#
| Column | Type | Notes |
|---|---|---|
route_ |
bigint unsigned, PK | |
route_ |
varchar(191) | May be empty |
route_ |
varchar(255), null | |
route_ |
varchar(191) | e.g. `GET |
route_ |
varchar(255), null | URI pattern |
route_ |
varchar(255), null | Comma-separated |
route_ |
varchar(255), null | METHOD / |
route_ |
varchar(255) | Controller@method or Closure |
route_ |
json, null | Full scan result |
created_, updated_ |
timestamp |
Relationships: routesIn() → many SystemRoutesIn; menusIn() → many SystemMenusIn.
system_routes_in — model SystemRoutesIn#
| Column | Type | Notes |
|---|---|---|
in_ |
bigint unsigned, PK | |
role_ |
bigint unsigned, FK → system_, indexed |
|
route_ |
bigint unsigned, FK → system_ |
Unique with role_ |
in_ |
enum(0,1,2), default 0 |
1 = allowed |
created_, updated_ |
timestamp |
Relationships: systemRoute(), systemRole().
Menu tables (experimental)#
system_menus — model SystemMenus#
| Column | Type |
|---|---|
menu_ |
bigint unsigned, PK |
menu_ |
varchar(255), null |
menu_ |
varchar(255), null |
menu_ |
enum(main,secondary), default secondary |
created_ |
varchar(255), null |
updated_ |
datetime, null |
system_menu_items — model SystemMenuItems#
| Column | Type |
|---|---|
item_ |
bigint unsigned, PK |
menu_ |
bigint unsigned, FK → system_, indexed |
route_ |
bigint unsigned, null, indexed |
parent_ |
bigint unsigned, null |
item_ |
varchar(255), null |
item_ |
enum(parent,child), default child |
item_ |
varchar(255), null |
item_ |
int, null |
created_ |
varchar(255), null |
updated_ |
datetime, null |
system_menus_in — model SystemMenusIn#
| Column | Type |
|---|---|
in_ |
bigint unsigned, PK |
menu_ |
bigint unsigned, FK → system_, indexed |
route_ |
bigint unsigned, null (unique with role_) |
item_ |
bigint unsigned, null |
role_ |
int, null |
in_ |
enum(0,1,2), default 0 |
created_, updated_ |
timestamp, null |
Useful queries#
Users per role:
SELECT r.role_name, COUNT(ur.user_id) AS users
FROM system_roles r
LEFT JOIN user_roles ur ON ur.user_role = r.role_id
GROUP BY r.role_id, r.role_name
ORDER BY r.role_sequence;The permission matrix as a grid:
SELECT ri.in_name, r.role_guard_name, ri.in_role
FROM system_roles_in ri
JOIN system_roles r ON r.role_id = ri.role_id
ORDER BY ri.in_name, r.role_sequence;Users without a role:
SELECT u.id, u.email
FROM users u
LEFT JOIN user_roles ur ON ur.user_id = u.id
WHERE ur.role_id IS NULL;