【发布时间】: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