This project is no longer maintained and has been archived.


Real World Examples


User Management System

In almost all applications you need to have some kind of security or authentication system where you have users, roles, permissions, etc. Below is an example where we setup several models that give you a basic user management and security system.

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',
            )
        );
    }
}

Here is the same example in YAML format. You can read more about YAML in the YAML Schema Files chapter:

1--- 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:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

Forum Application

Below is an example of a forum application where you have categories, boards, threads and posts:

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->hasMany( 'Forum_Entry as Entries',
            array(
                'local'   => 'id',
                'foreign' => 'thread_id',
            )
        );
    }
}

Here is the same example in YAML format. You can read more about YAML in the YAML Schema Files chapter:

1--- 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

Conclusion

I hope that these real world schema examples will help you with using Doctrine in the real world in your application. The last chapter of this book will discuss the coding standards used in Doctrine and are recommended for you to use in your application as well. Remember, consistency in your code is key!