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')
Комментариев нет:
Отправить комментарий