You are currently reading the 1.2 documentation. Switch to 2.2  2.1  2.0 

Real World Examples

ユーザー管理システム

ほとんどすべてのアプリケーションではユーザー、ロール、パーミッションなど何らかのセキュリティもしくは認証システムを提供する必要があります。基本的なユーザー管理とセキュリティシステムを提供するいくつかのモデルの例です。

class User extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('username', 'string', 255, array(
                'unique' => true
            )
        );
        $this->hasColumn('password', 'string', 255);
    }
}

class Role extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('name', 'string', 255);
    }
}

class Permission extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('name', 'string', 255);
    }
}

class RolePermission extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('role_id', 'integer', null, array(
                'primary' => true
            )
        );
        $this->hasColumn('permission_id', 'integer', null, array(
                'primary' => true
            )
        );
    }

    public function setUp()
    {
        $this->hasOne('Role', array(
                'local' => 'role_id',
                'foreign' => 'id'
            )
        );
        $this->hasOne('Permission', array(
                'local' => 'permission_id',
                'foreign' => 'id'
            )
        );
    }
}

class UserRole extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('user_id', 'integer', null, array(
                'primary' => true
            )
        );
        $this->hasColumn('role_id', 'integer', null, array(
                'primary' => true
            )
        );
    }

    public function setUp()
    {
        $this->hasOne('User', array(
                'local' => 'user_id',
                'foreign' => 'id'
            )
        );
        $this->hasOne('Role', array(
                'local' => 'role_id',
                'foreign' => 'id'
            )
        );
    }
}

class UserPermission extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('user_id', 'integer', null, array(
                'primary' => true
            )
        );
        $this->hasColumn('permission_id', 'integer', null, array(
                'primary' => true
            )
        );
    }

    public function setUp()
    {
        $this->hasOne('User', array(
                'local' => 'user_id',
                'foreign' => 'id'
            )
        );
        $this->hasOne('Permission', array(
                'local' => 'permission_id',
                'foreign' => 'id'
            )
        );
    }
}

YAMLフォーマットでの例は次の通りです。YAML Schema Filesの章でYAMLの詳細を読むことができます:

---
User:
  columns:
    username: string(255)
    password: string(255)
  relations:
    Roles:
      class: Role
      refClass: UserRole
      foreignAlias: Users
    Permissions:
      class: Permission
      refClass: UserPermission
      foreignAlias: Users

Role:
  columns:
    name: string(255)
  relations:
    Permissions:
      class: Permission
      refClass: RolePermission
      foreignAlias: Roles

Permission:
  columns:
    name: string(255)

RolePermission:
  columns:
    role_id:
      type: integer
      primary: true
    permission_id:
      type: integer
      primary: true
  relations:
    Role:
    Permission:

UserRole:
  columns:
    user_id:
      type: integer
      primary: true
    role_id:
      type: integer
      primary: true
  relations:
    User:
    Role:

UserPermission:
  columns:
    user_id:
      type: integer
      primary: true
    permission_id:
      type: integer
      primary: true
  relations:
    User:
    Permission:

フォーラムアプリケーション

カテゴリ、ボードと、スレッドと投稿機能を持つフォーラムアプリケーションの例は次の通りです:

class Forum_Category extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('root_category_id', 'integer', 10);
        $this->hasColumn('parent_category_id', 'integer', 10);
        $this->hasColumn('name', 'string', 50);
        $this->hasColumn('description', 'string', 99999);
    }

    public function setUp()
    {
        $this->hasMany('Forum_Category as Subcategory', array(
                'local' => 'parent_category_id',
                'foreign' => 'id'
            )
        );
        $this->hasOne('Forum_Category as Rootcategory', array(
                'local' => 'root_category_id',
                'foreign' => 'id'
            )
        );
    }
}

class Forum_Board extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('category_id', 'integer', 10);
        $this->hasColumn('name', 'string', 100);
        $this->hasColumn('description', 'string', 5000);
    }

    public function setUp()
    {
        $this->hasOne('Forum_Category as Category', array(
                'local' => 'category_id',
                'foreign' => 'id'
            )
        );
        $this->hasMany('Forum_Thread as Threads',  array(
                'local' => 'id',
                'foreign' => 'board_id'
            )
        );
    }
}

class Forum_Entry extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('author', 'string', 50);
        $this->hasColumn('topic', 'string', 100);
        $this->hasColumn('message', 'string', 99999);
        $this->hasColumn('parent_entry_id', 'integer', 10);
        $this->hasColumn('thread_id', 'integer', 10);
        $this->hasColumn('date', 'integer', 10);
    }

    public function setUp()
    {
        $this->hasOne('Forum_Entry as Parent',  array(
                'local' => 'parent_entry_id',
                'foreign' => 'id'
            )
        );
        $this->hasOne('Forum_Thread as Thread', array(
                'local' => 'thread_id',
                'foreign' => 'id'
            )
        );
    }
}

class Forum_Thread extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('board_id', 'integer', 10);
        $this->hasColumn('updated', 'integer', 10);
        $this->hasColumn('closed', 'integer', 1);
    }

    public function setUp()
    {
        $this->hasOne('Forum_Board as Board', array(
                'local' => 'board_id',
                'foreign' => 'id'
            )
        );

        $this->ownsMany('Forum_Entry as Entries', array(
                'local' => 'id',
                'foreign' => thread_id'
            )
        );
    }
}

YAMLフォーマットでの例は次の通りです。YAML Schema Filesの章でYAMLの詳細を読むことができます:

---
Forum_Category:
  columns:
    root_category_id: integer(10)
    parent_category_id: integer(10)
    name: string(50)
    description: string(99999)
  relations:
    Subcategory:
      class: Forum_Category
      local: parent_category_id
      foreign: id
    Rootcategory:
      class: Forum_Category
      local: root_category_id
      foreign: id

Forum_Board:
  columns:
    category_id: integer(10)
    name: string(100)
    description: string(5000)
  relations:
    Category:
      class: Forum_Category
      local: category_id
      foreign: id
    Threads:
      class: Forum_Thread
      local: id
      foreign: board_id

Forum_Entry:
  columns:
    author: string(50)
    topic: string(100)
    message: string(99999)
    parent_entry_id: integer(10)
    thread_id: integer(10)
    date: integer(10)
  relations:
    Parent:
      class: Forum_Entry
      local: parent_entry_id
      foreign: id
    Thread:
      class: Forum_Thread
      local: thread_id
      foreign: id

Forum_Thread:
  columns:
    board_id: integer(10)
    updated: integer(10)
    closed: integer(1)
  relations:
    Board:
      class: Forum_Board
      local: board_id
      foreign: id
    Entries:
      class: Forum_Entry
      local: id
      foreign: thread_id

まとめ

これらの実際の世界のスキーマの例によってDoctrineの実際のアプリケーションを使うことに役立つことを願っております。この本の最後の章ではコーディング規約を検討します。コーディング規約はあなたのアプリケーションにもお勧めします。コードの一貫性が大切であることを覚えておいてください!


Questions and Feedback

If you find a problem with the documentation or have a suggestion, please register and open a ticket.

If you need support or have a technical question, you can post to the user mailing-list.