Ярлыки

.htaccess (4) тестирование (8) шаблоны проектирования (3) css (5) Debian (6) docker (2) Doctrine2 (6) Git (6) html (4) java (6) javascript (13) jquery (11) LFS (3) linux (23) mac os (4) mod_rewrite (2) MSSQL (4) MySQL (18) ORM Doctrine (17) patterns (3) PDO (3) perl (7) PHP (64) PHPUnit (8) Python (15) SEO (2) Silex (1) SimpleXML (1) SQL (14) ssh (4) Ubuntu (24) Yii1 (1) Zend Framework (19) ZendFramework2 (8)

четверг, 7 октября 2010 г.

ORM Doctrine. Наследование (Column Aggregation)

Предположим, что у нас есть таблица Entity. В нашем приложении мы вводим две сушности
User и Group, которые обе являются Entity и их данные хранятся в одной таблице. Таблица (класс) Entity имеет атрибут type, определяющий, относится объект (запись) к классу User или Group. Мы определяем, что для User type равен 1, а для Group - 2.

Все что нам нужно - это создать 3 записи и вызвать метод Doctrine_Table::setSubclasses() в родительском классе:

// models/Entity.php

class Entity extends Doctrine_Record
{
public function setTableDefinition()
{
$this->hasColumn('name', 'string', 30);
$this->hasColumn('username', 'string', 20);
$this->hasColumn('password', 'string', 16);
$this->hasColumn('created_at', 'timestamp');
$this->hasColumn('update_at', 'timestamp');

$this->setSubclasses(array(
'User' => array('type' => 1),
'Group' => array('type' => 2)
)
);
}
}

// models/User.php
class User extends Entity
{ }

// models/Group.php
class Group extends Entity
{ }

Это же в формате YAML:

---
Entity:
columns:
username: string(20)
password: string(16)
created_at: timestamp
updated_at: timestamp

User:
inheritance:
extends: Entity
type: column_aggregation
keyField: type
keyValue: 1

Group:
inheritance:
extends: Entity
type: column_aggregation
keyField: type
keyValue: 2

Если посмотреть SQL, который генерируется в этом случае, то увидим следующее для всех трех классов:

// test.php

// ...
$sql = Doctrine_Core::generateSqlFromArray(array('Entity', 'User', 'Group'));
echo $sql[0];

CREATE TABLE entity (id BIGINT AUTO_INCREMENT,
username VARCHAR(20),
password VARCHAR(16),
created_at DATETIME,
updated_at DATETIME,
type VARCHAR(255),
PRIMARY KEY(id)) ENGINE = INNODB


Ну и дальше играемся с этим как хотим, логика очевидна:

// test.php

// ...
$user = new User();
$user->name = 'Bjarte S. Karlsen';
$user->username = 'meus';
$user->password = 'rat';
$user->save();

// ...
$group = new Group();
$group->name = 'Users';
$group->username = 'users';
$group->password = 'password';
$group->save();


// ...
$q = Doctrine_Query::create()
->from('Entity e')
->where('e.id = ?');

$user = $q->fetchOne(array($user->id));

echo get_class($user); // User

// ...
$q = Doctrine_Query::create()
->from('Entity e')
->where('e.id = ?');

$group = $q->fetchOne(array($group->id));

echo get_class($group); // Group


// Мы можем делать индивидуальные выборки для каждой модели
$q = Doctrine_Query::create()
->select('u.id')
->from('User u');

echo $q->getSqlQuery();

// вызов метода $q->getSql() вернет следующий запрос
SELECT
e.id AS e__id
FROM entity e
WHERE (e.type = '1')

Комментариев нет:

Отправить комментарий