Доктрина расширяет расширенную модель с помощью агрегации столбцов - PullRequest
0 голосов
/ 23 февраля 2010

Методы: ORM, Доктрина 1.1.6, KohanaPHP

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

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

У меня есть класс Entity, который содержит идентификатор, логин и пароль и имеет один адрес электронной почты, множество адресов и некоторые другие отношения. У меня есть два других класса, Company и Person, которые расширяют сущность. Я хочу расширить их, используя Объединение столбцов , чтобы вся информация о логине и пароле сохранялась в одном месте. Теперь я хочу добавить определенные столбцы в мой класс 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

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

1 Ответ

1 голос
/ 24 февраля 2010

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

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

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

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

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

...