0

技术:ORM、Doctrine 1.1.6、KohanaPHP

使用教义 1.1.6。如何将模型分布在不同的表上?

详细情况:

我有一个实体类,它包含一个 ID、登录名和密码,并且有一个电子邮件地址、许多地址和一些其他关系。我还有另外两个类,Company 和 Person,它们扩展了 Entity。我想使用Column 聚合来扩展它们,以便所有登录名和密码信息都保存在一个地方。现在我想将特定列添加到我的 Person 类(名字、姓氏等),但我找不到如何做到这一点。文档给出的唯一示例是没有额外列的示例。

当前课程

实体类:

类实体扩展了 Doctrine_Record
{
    公共函数 setTableDefinition() {
        $this->setTableName('entity');
        $this->hasColumn('id', 'integer', 4, array(
             '类型' => '整数',
             '长度' => 4,
             '无符号' => 0,
             '主要' => 真,
             '自动增量' => 真,
             ));
        $this->hasColumn('login', 'string', 64, array(
             '类型' => '字符串',
             '长度' => 64,
             '固定' => 假,
             '主要' => 假,
             'notnull' => 真,
             '自动增量' => 假,
             ));
        $this->hasColumn('密码', '字符串', 64, 数组(
             '类型' => '字符串',
             '长度' => 64,
             '固定' => 假,
             '主要' => 假,
             'notnull' => 真,
             '自动增量' => 假,
             ));
        $this->hasColumn('created', 'date', null, array(
             '类型' => '日期',
             '主要' => 假,
             'notnull' => 假,
             '自动增量' => 假,
             ));
        $this->hasColumn('modified', 'date', null, array(
             '类型' => '日期',
             '主要' => 假,
             'notnull' => 假,
             '自动增量' => 假,
             ));

        $this->setSubclasses(数组(
                '人' => 数组(“类型” => 1)
            ));
    }
}

人物类:

类人扩展实体
{
    公共函数 setTableDefinition() {
        $this->setTableName('person');
        $this->hasColumn('id', 'integer', 4, array(
             '类型' => '整数',
             '长度' => 4,
             '无符号' => 0,
             '主要' => 真,
             '自动增量' => 真,
             ));
        $this->hasColumn('firstname', 'string', 255, array(
             '类型' => '字符串',
             '长度' => 255,
             '固定' => 假,
             '主要' => 假,
             'notnull' => 真,
             '自动增量' => 假,
             ));
        $this->hasColumn('insertion', 'string', 64, array(
             '类型' => '字符串',
             '长度' => 64,
             '固定' => 假,
             '主要' => 假,
             'notnull' => 假,
             '自动增量' => 假,
             ));
        $this->hasColumn('lastname', 'string', 255, array(
             '类型' => '字符串',
             '长度' => 255,
             '固定' => 假,
             '主要' => 假,
             'notnull' => 真,
             '自动增量' => 假,
             ));
    }
}

生成的 SQL:

创建表`人`(
    `id` INT AUTO_INCREMENT,
    `firstname` VARCHAR(255) NOT NULL,
    `插入` VARCHAR(64),
    `lastname` VARCHAR(255) NOT NULL,
    主键(`id`)
) 引擎 = INNODB

创建表`实体`(`
    id` INT AUTO_INCREMENT,
    `login` VARCHAR(64) NOT NULL,
    `password` VARCHAR(64) NOT NULL,
    `创建`日期,
    `修改`日期,
    主键(`id`)
) 引擎 = INNODB

有人可以告诉我如何做到这一点吗?

4

1 回答 1

1

您必须将这些列添加到实体类中,因为所有内容基本上都存储在同一个表中。这意味着这些列也可用于公司条目,但也许您可以在此处禁止使用它们。

但是,您可以使用不同的表并使用外键引用它们。这将为您提供如下布局:

  1. entity - 存储所有实体共有的基本信息。此外,您将此实体(用户、公司)的类型存储为 id。
  2. entity_types - 存储每个实体类型的对应表
  3. 用户- 存储特定于用户的信息和对应实体的密钥。
  4. Company - 与User相同,如果没有其他信息,可能几乎为空(取决于您如何实施此解决方案,为简单起见,您仍然可以添加仅包含实体 id 的一行)

通过这种方式,您始终可以(懒惰地)获取有关您的实体的其他信息,并且表本身保持苗条。如果您将实体实现为列聚合,Doctrine 将负责返回正确的对象。然后,您可以添加自定义函数来获取附加信息。

您可以省略 2 中的间接性。

于 2010-02-24T19:39:51.333 回答