【问题标题】:PHP ORM inheritance workaround?PHP ORM继承解决方法?
【发布时间】:2011-03-23 04:19:02
【问题描述】:


我正在构建一个 Web 应用程序,并希望使用 ORM 将 db 中的数据与对象进行映射。
这几天我一直在为此苦苦挣扎,并尝试了各种实现,包括:Codeigniter ORM、Kohana ORM、PHP.ActiveRecords 和 Doctrine
最后两个我不能真正使用,因为它们依赖于我的共享托管服务器上未安装(也不能安装)的 PHP 5.3。

所有这些 ORM 的问题是继承(Doctrine 除外,但我不能使用它)。
我知道很多开发人员只是在没有继承的情况下做 db-s,但这是我的问题:

我的数据库需要是多语言的,我通过以下示例设计了我的数据库:
Product -> id, category_id, price...(所有不可翻译的)
ProductTranslation-> id, language_id, name, description...(与产品相同的id,添加语言FK,以及可翻译的字段)

也许有更好的方法,但我真的很喜欢这个,因为它非常灵活(可以添加新语言)并且不会在db中放很多NULL-s,也加入是不是那么昂贵,因为表相对较小(与将所有翻译放在一个表中并从所有其他表中引用该表的方法不同)。

我发现,支持 ORM 的唯一解决方法是在Product->ProductTranslation 之间放置has_one 关系。

这样我可以访问翻译后的字段,例如:
DB::get_product_by_id(4)->translation->name

别管语法,但这种方法的真正问题是我必须为翻译表定义新对象(模型),从逻辑上讲它们不属于那里。它们不是实体,只是实体的附加数据。

所以,我的问题是:

  • 有没有更好的方法在数据库中组织语言,更ORM 友好
  • 还有其他支持继承的 PHP ORM-s (Kohana ORM ihertiance module,但它似乎已过时,并且不适用于当前的框架版本
  • 对于继承问题还有其他解决方法吗?

【问题讨论】:

    标签: php database inheritance orm mapping


    【解决方案1】:

    Doctrine 2.0 需要 PHP 5.3,但 Doctrine 1.2.x 在 PHP 5.2.3 或更高版本上运行良好。

    【讨论】:

    • Doctrine 1.2.x 很棒!谢谢你的建议。它仍然无法处理多个数据库表,而不必为每个表定义一个模型类,但我想我将不得不忍受这一点,并为所有内容创建类。与大多数其他 ORM 不同,至少它具有适当的继承性
    • 只是补充一点,在阅读了一些文档之后,学说有一个内置的 I18n 行为,这正是我想要的。非常感谢!教义是解决这个问题的方法
    【解决方案2】:

    为什么不使用Propel's i18n behavior

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多