【问题标题】:What is the best way to create a tableA HABTM tableA relationship for a CakePHP application?为 CakePHP 应用程序创建 tableA HABTM tableA 关系的最佳方法是什么?
【发布时间】:2010-09-18 14:45:13
【问题描述】:

我需要创建功能以允许我的注册用户将自己与其他用途相关联并创建一个家庭。我的数据库表如下所示:

db.persons -(Bob、Jane、Timmy 等)

  • 身份证
  • 姓名
  • 电子邮件

db.persons_persons

  • 身份证
  • person__id_parent
  • person_id_child
  • relationtype_id

db.relationtypes -(配偶、孩子、侄子等)

  • 身份证
  • 姓名

使用这个结构,我应该能够在persons_persons 表中指定Bob 是Jane 的配偶。 db.persons_persons 中的记录看起来像(伪):

ID | person_parent | person_child | relationtype
1  | Bob           | Jane         | Spouse
2  | Bob           | Timmy        | Child

我意识到这可能会导致一些数据碎片化,因为如果 Bob 和 Jane 结婚了,那么其中一个的孩子就必须与另一个相关联。然而,这不是我的问题。我的问题是这个数据库设置对于 cakePHP 应用程序是否“最正确”。

【问题讨论】:

    标签: php database-design cakephp


    【解决方案1】:

    首先,CakePHP 会自动将people 表变形为people 控制器和person 模型,因此您无需将其称为persons。然后我会调用查找表relationships 而不是persons_persons

    我会将您的关系表中的字段称为 person_idrelation_idrelation_type_id,然后在您的 relationtypes 表名中添加一个下划线,使其变为 relation_types

    我认为这更符合语义。

    您仍然可以使用 hasAndBelongsToMany 关联,并利用 CakePHP(仅限 1.2)提供的自动魔术“with”关联来访问 HABTM 表中关系类型的附加数据。

    但是,我很想使用:

    • PersonhasMany Relation
    • Relation 属于Person, Relation, RelationType

    在您的应用中,他人与他们的关系是否暗示了人与人之间的关系? IE。如果你发现 Person.id = 1 你可能会得到他们所有的关系,例如Person.id 2、3 和 4。但如果找到 Person.id 2,则不会自动得到 Person.id = 1,除非关系表中有另一条记录表示该关系。

    为此,您可以设置另一个关联:

    • Person hasMany Relation1 with foreignKey person_id
    • Person hasMany Relation2 with foreignKey relation_id
    • Relation 属于Person, Relation, RelationType

    注意,您也可以通过 HABTM 实现这种双重关系。

    【讨论】:

    • 这正是我正在寻找的建议。非常清晰,有见地,有益。非常感谢。
    猜你喜欢
    • 2011-04-25
    • 2021-10-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多