Ярлыки

.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)

среда, 22 сентября 2010 г.

ORM Doctrine. Реальное наследование (concrete inheritance).

При этом типе наследования ORM Doctrine создает отдельные таблицы для дочерних классов. При этом каждый класс генерирует таблицы, которые содержат все столбцы (включая и унаследованные). Для того чтобы использовать такой тип наследования, вам необходимо явно вызвать parent::setTableDefinition()
у дочерних классов, как показано ниже:


// models/TextItem.php

class TextItem extends Doctrine_Record
{
public function setTableDefinition()
{
$this->hasColumn('topic', 'string', 100);
}
}



Теперь давайте создадим модель Comment, расширяющую TextItem, и добавим новый столбец content:

// models/Comment.php

class Comment extends TextItem
{
public function setTableDefinition()
{
parent::setTableDefinition();

$this->hasColumn('content', 'string', 300);
}
}


Теперь в формате YAML:

---
# schema.yml

# ...
TextItem:
columns:
topic: string(100)

Comment:
inheritance:
extends: TextItem
type: concrete
columns:
content: string(300)


Если посмотреть SQL ...

// test.php

// ...
$sql = Doctrine_Core::generateSqlFromArray(array('TextItem', 'Comment'));
echo $sql[0] . "\n";
echo $sql[1];



CREATE TABLE text_item (id BIGINT AUTO_INCREMENT,
topic VARCHAR(100),
PRIMARY KEY(id)) ENGINE = INNODB

CREATE TABLE comment (id BIGINT AUTO_INCREMENT,
topic VARCHAR(100),
content TEXT,
PRIMARY KEY(id)) ENGINE = INNODB

Вам совсем не обязательно создавать новые столбцы у дочерних классов, в случае, если вы просто хотите хранить данные в разных таблицах.

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

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