【问题标题】:Doctrine expand extended model using column aggregationDoctrine 使用列聚合扩展扩展模型
【发布时间】:2011-01-20 03:35:11
【问题描述】:

技术:ORM、Doctrine 1.1.6、KohanaPHP

使用 Doctrine 1.1.6。如何将模型分布到不同的表中?

详细情况:

我有一个实体类,它包含一个 ID、登录名和密码,并且有一个电子邮件地址、多个地址和一些其他关系。我还有另外两个类,Company 和 Person,它们扩展了 Entity。我想使用Column aggregation 扩展它们,因此所有登录名和密码信息都保存在一个地方。现在我想将特定列添加到我的 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:

创建表`person` (
    `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`)
) ENGINE = INNODB

谁能告诉我如何做到这一点?

【问题讨论】:

    标签: orm doctrine models multiple-tables


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • @Larry_Croft:所以我想要的基本上是不可能的?我必须将我的个人信息和公司信息放在一张表中吗?
    • 是的,至少对于列聚合。我会为我的答案添加一个替代解决方案。
    • 谢谢。你建议我以前的情况(没有冒犯,你不知道)。我想我会尝试扩展你/我的/我们的想法。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多