Doctrine расширяет расширенную модель с помощью агрегации столбцов

Методы: ORM, Doctrine 1.1.6, KohanaPHP

С Doctrine 1.1.6. Как распределить модель по разным таблицам?

Подробная ситуация:

У меня есть класс Entity, который содержит идентификатор, логин и пароль и имеет один адрес электронной почты, много адресов и некоторые другие отношения. У меня есть два других класса, Company и Person, которые расширяют Entity. Я хочу расширить их, используя агрегацию столбцов Таким образом, вся информация для входа в систему и пароля хранится в одном месте. Теперь я хочу добавить определенные столбцы в свой класс Person (имя, фамилию и т. Д.), Но не могу найти, как это сделать. Единственный пример, приведенный в документации, - это пример без дополнительных столбцов.

Текущие классы

Класс сущности:

class Entity extends Doctrine_Record
{
    public function setTableDefinition() {
        $this->setTableName('entity');
        $this->hasColumn('id', 'integer', 4, array(
             'type' => 'integer',
             'length' => 4,
             'unsigned' => 0,
             'primary' => true,
             'autoincrement' => true,
             ));
        $this->hasColumn('login', 'string', 64, array(
             'type' => 'string',
             'length' => 64,
             'fixed' => false,
             'primary' => false,
             'notnull' => true,
             'autoincrement' => false,
             ));
        $this->hasColumn('password', 'string', 64, array(
             'type' => 'string',
             'length' => 64,
             'fixed' => false,
             'primary' => false,
             'notnull' => true,
             'autoincrement' => false,
             ));
        $this->hasColumn('created', 'date', null, array(
             'type' => 'date',
             'primary' => false,
             'notnull' => false,
             'autoincrement' => false,
             ));
        $this->hasColumn('modified', 'date', null, array(
             'type' => 'date',
             'primary' => false,
             'notnull' => false,
             'autoincrement' => false,
             ));

        $this->setSubclasses(array(
                'Person' => array("type" => 1)
            ));
    }
}

Класс человека:

class Person extends Entity
{
    public function setTableDefinition() {
        $this->setTableName('person');
        $this->hasColumn('id', 'integer', 4, array(
             'type' => 'integer',
             'length' => 4,
             'unsigned' => 0,
             'primary' => true,
             'autoincrement' => true,
             ));
        $this->hasColumn('firstname', 'string', 255, array(
             'type' => 'string',
             'length' => 255,
             'fixed' => false,
             'primary' => false,
             'notnull' => true,
             'autoincrement' => false,
             ));
        $this->hasColumn('insertion', 'string', 64, array(
             'type' => 'string',
             'length' => 64,
             'fixed' => false,
             'primary' => false,
             'notnull' => false,
             'autoincrement' => false,
             ));
        $this->hasColumn('lastname', 'string', 255, array(
             'type' => 'string',
             'length' => 255,
             'fixed' => false,
             'primary' => false,
             'notnull' => true,
             'autoincrement' => false,
             ));
    }
}

Сгенерированный SQL:

CREATE TABLE `person` (
    `id` INT AUTO_INCREMENT, 
    `firstname` VARCHAR(255) NOT NULL, 
    `insertion` VARCHAR(64), 
    `lastname` VARCHAR(255) NOT NULL, 
    PRIMARY KEY(`id`)
) ENGINE = INNODB

CREATE TABLE `entity` (`
    id` INT AUTO_INCREMENT, 
    `login` VARCHAR(64) NOT NULL, 
    `password` VARCHAR(64) NOT NULL, 
    `created` DATE, 
    `modified` DATE, 
    PRIMARY KEY(`id`)
) ENGINE = INNODB

Может кто-нибудь сказать мне, как это сделать?


person Rene Terstegen    schedule 23.02.2010    source источник


Ответы (1)


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

Однако вы можете использовать разные таблицы и ссылаться на них с помощью внешнего ключа. Это даст вам такой макет:

  1. entity - хранит основную информацию, общую для всех сущностей. Кроме того, вы сохраняете тип этой сущности (Пользователь, Компания) в качестве идентификатора.
  2. entity_types - хранит соответствующую таблицу для каждого типа объекта.
  3. Пользователь - хранит информацию, относящуюся к пользователям, и ключ к соответствующей сущности.
  4. Компания - то же, что и Пользователь, может быть почти пустым, если нет дополнительной информации (в зависимости от того, как вы реализуете это решение, вы все равно можете добавить одну строку, содержащую только идентификатор объекта. для простоты)

Таким образом, вы можете всегда (лениво) получать дополнительную информацию о своих объектах, а сама таблица остается тонкой. Если вы понимаете сущность как агрегацию столбцов, Doctrine позаботится о возврате нужного объекта. Затем вы можете добавить свои собственные функции для получения дополнительной информации.

Вы можете опустить косвенное указание в 2.

person Thomas Schaub    schedule 24.02.2010
comment
@Larry_Croft: Значит, то, что я хочу, невозможно? Мне нужно поместить информацию о моей личности и компании в одну таблицу? - person Rene Terstegen; 25.02.2010
comment
Да, по крайней мере, с агрегацией столбцов. Я добавлю к своему ответу альтернативное решение. - person Thomas Schaub; 25.02.2010
comment
Спасибо. Вы предлагаете мою старую ситуацию (без обид, вы не могли знать). Думаю, я постараюсь развить вашу / мою / нашу идею. В очередной раз благодарим за помощь! - person Rene Terstegen; 25.02.2010