Doctrine 1.2 多对多关系的列命名约定

Posted

技术标签:

【中文标题】Doctrine 1.2 多对多关系的列命名约定【英文标题】:Doctrine 1.2 Column Naming Conventions for Many To Many Relationships 【发布时间】:2010-06-17 17:14:40 【问题描述】:

我正在使用现有的数据库架构,并尝试设置两个具有多对多关系的 Doctrine 模型,as described in this document

从头开始创建表时,我可以轻松完成这项工作。但是,现有的连接表使用与 Doctrine 文档中描述的不同的命名约定。具体

Table 1
--------------------------------------------------
table_1_id
....other columns....

Table 2
--------------------------------------------------
table_2_id
....other columns....

Join Table
--------------------------------------------------
fktable1_id
fktable_2_id

基本上,以前的开发人员在所有外键前面都加上fk

从我看到的示例和一些简短的代码试验来看,Doctrine 1.2 要求连接表使用与其连接的表相同的列名

    我的假设正确吗?

    如果是,第二条教义的情况是否发生了变化?

    如果以上任何一个的答案都是正确的,您如何配置模型以使所有列“对齐”

【问题讨论】:

【参考方案1】:

查看at the docs 的 N:M 关系。

当你看时

$this->hasColumn('user_id', 'integer', null, array(
                'primary' => true
            )
        );

从文档中可以看出,如何命名连接模型中的列取决于您自己。

既然你有一个现有的数据库,为什么不通过 Doctrine 生成模型? API 向您展示了所需的选项。我自己用过,效果很好。如果您有一个复杂的结构,有时您可能需要进行一些清理,但生成的文件是一个很好的开始。

【讨论】:

我确实从数据库中生成了我的模型,但它没有拾取关系。您是否需要将一个特殊选项传递给 generateModelsFromDb 方法来告诉教义对关系进行最佳猜测? 不,生成的时候应该没问题。您是否在应用程序中测试过生成的模型? 啊,我想我明白你的意思了。如果其他人不清楚,将数据库列名称别名为字段名称所需的学说可以解决问题 ($this->hasColumn('fksection_id as section_id')【参考方案2】:

您只需设置本地和外部部分以匹配您的列名

Table1:
  columns:
    table_1_id: int
    ....
  relations:
    Table2:
      foreignAlias: FromSecond
      local: table_1_id
      foreign: fktable1_id
      refClass: JoinTable
Table2:
  columns:
    table_2_id: int
    ....
  relations:
    Table1:
      foreignAlias: FromFirst
      local: table_2_id
      foreign: fktable2_id
      refClass: JoinTable
JoinTable:
  columns:
    fktable1_id: int
    fktable2_id: int
  relations:
    Table1:
    Table2:

【讨论】:

我不会立即跳入 YAML 来避免整个“一次有太多新事物”的心理问题。以上生成了什么样的类/设置方法?

以上是关于Doctrine 1.2 多对多关系的列命名约定的主要内容,如果未能解决你的问题,请参考以下文章

在 Doctrine 中创建多对多关系的最佳实践。

多对多关系上的 Doctrine2 findBy()

使用 Doctrine 和 Symfony2 查询多对多关系

从与 Doctrine2 的多对多关系中获取数据

如何避免与 Doctrine2 和 Zend Framework 2 的多对多关系重复?

在 symfony/doctrine 的 schema.yml 中,我应该在哪里放置 onDelete: CASCADE 用于多对多关系?