データベースと ORM

エンティティの階層、BaseService パターン、マイグレーション、そしてシードデータ。

このページ内

データベースと ORM

エンティティの階層

すべてのエンティティは BaseEntity(@mappedsuperclass、それ自体は cborm.models.ActiveEntity を継承しています)を継承しており、これによってすべてのテーブルに createdDate、modifiedDate、そしてソフトデリート用の isActive フラグが自動的に追加されます。

classDiagram
    class BaseEntity {
        +createdDate
        +modifiedDate
        +isActive
        +getId()
        +isLoaded()
        +appendToMemento()
    }
    class User
    class Role
    class Permission
    class APIToken
    class RememberToken
    class Passkey
    class Setting

    BaseEntity <|-- User
    BaseEntity <|-- Role
    BaseEntity <|-- Permission
    BaseEntity <|-- APIToken
    BaseEntity <|-- RememberToken
    BaseEntity <|-- Passkey
    BaseEntity <|-- Setting

    User "many" --> "many" Role : roles
    User "many" --> "many" Permission : à la carte
    User "1" --> "many" APIToken
    User "1" --> "many" RememberToken
    User "1" --> "many" Passkey
    Role "many" --> "many" Permission : role_permissions

dbcreate: "none"(public/Application.bx の ormSettings で設定されています)は、スキーマがマイグレーションのみによって管理されることを意味します — ORM が自動的にテーブルを生成したり変更したりすることは決してありません。

サービス層のパターン

すべてのサービスは BaseService(@singleton、cborm.models.VirtualEntityService を継承しています)を継承しており、qb、coldbox、wirebox、cachebox:template を注入し、ensureSortOrder() を提供します。

component
    extends="BaseService"
    singleton
    threadSafe
{

    property name="qb"    inject="provider:QueryBuilder@qb";
    property name="cache" inject="cachebox:template";

    function list( struct criteria = {} ){
        return newCriteria()
            .when( criteria.search, function( c, term ){
                c.like( "name", "%#term#%" );
            } )
            .list();
    }

}
/**
 * A role: a named bundle of permissions.
 */
class extends="app.models.BaseEntity" table="roles" {

    property name="roleId" fieldtype="id" generator="uuid2" ormtype="string";
    property name="name" type="string";

    property name="permissions"
        fieldtype="many-to-many"
        cfc="Permission"
        linktable="role_permissions";

}
component extends="app.models.BaseService" singleton threadSafe {

    function getAllForLookup(){
        return newCriteria().resultTransformer( "distinct" ).list();
    }

}

マイグレーション

commandbox-migrations CLI モジュール経由の cfmigrations によって実現されており、.cbmigrations.json(migrationsDirectory: resources/database/migrations/、seedsDirectory: resources/database/seeds/、接続は public/Application.bx と同じ DB_* 環境変数から構築されます)で設定されています。

box migrate up           # Run pending migrations
box migrate down         # Rollback the last batch
box migrate reset        # Rollback everything, then re-migrate
box migrate seed run     # Run database seeders

マイグレーションはファイル名/タイムスタンプの順に実行されます。

マイグレーション作成するもの
..._settings.bxsettings(GUID 主キー、一意な name、longtext の value)
..._security.bxpermissions、roles、role_permissions(複合主キーの結合テーブル、カスケード外部キー)
..._users.bxusers(GUID 主キー、一意な email、セルフサービスのメールアドレス変更リクエスト用の null 許容 pendingEmail、null 許容 password、JSON 型の preferences、cbfs の assets ディスクにアップロードされたアバターを持っているかどうかを追跡する真偽値 hasAvatar)、および user_roles、user_permissions、user_remember_tokens、user_api_tokens、user_action_tokens、user_passkeys、user_sso_identities — すべての子テーブルが ON DELETE CASCADE で users.userId に外部キー結合されています(セキュリティと権限 と フロントエンド を参照)
..._auditlogs.bx重大度/カテゴリ/アクション、アクターとリクエストのメタデータ、そしてクエリ用インデックスを持つ、追記専用のアクティビティ記録である audit_logs

シードデータ

box migrate seed run によって実行される resources/database/seeds/AdminData.bx は次を作成します。

  • Admin ロール
  • 5 つのリソース(users、roles、permissions、settings、auditlog)にわたる 20 個の権限で、それぞれ read/write/delete/admin(auditlog は read/export/delete/admin)を持ち — すべて Admin ロールに割り当てられます
  • 1 人の管理者ユーザー admin@cbgenesis.com で、Admin ロールが割り当てられ、リセット保留としてシードされているため、公開されているブートストラップパスワードは初回サインイン時に置き換えられなければなりません

これらのスラッグがハンドラーレベルでどのように強制されるかについては、セキュリティと権限 を参照してください。

このページを編集 Markdown をダウンロード 最終更新日 Oct 1, 2026, 11:06:51 AM