什么是最易于使用的PHP ORM框架?

17
我正在寻找类似于Ruby的Active Record的东西,但这是针对PHP的。我只需定义我的字段,扩展基本ORM类,就可以获得免费的ACID操作。我应该获得默认的getter和setter,而无需编写任何代码,但是覆盖默认的getter或setter很容易,只需声明get$fieldName或set$fieldName函数即可,带有我想要的行为。Symfony让您为每个对象创建约5个文件,并且据我所知,所有已定义的对象都会加载。有更好的选择吗?它为什么更好?您能在回答中提供简单的示例吗?
除了Symfony之外,我还看过Doctrine这个ORM。那里也需要创建描述数据结构的yaml文件。数据库已经定义了这些内容。有什么方法可以读取我的表定义,而无需生成和存储配置文件?

我在下面发布了一个解决您Doctrine问题的方案。运行./doctrine generate-models-db或./doctrine generate-yaml-db将反向工程化您的数据库为类和yaml文件。 - dcousineau
13个回答

11

我是Doctrine的忠实粉丝,它是一个功能齐全的ORM,将替代Propel成为Symfony的默认ORM。

它具备基本ORM功能,同时还有一个功能完善的查询构建器,我觉得非常好用。

它配备了一套命令行工具来管理您的数据库。例如,您可以使用YAML创建模式和fixtures,并让Doctrine基于模式生成类,创建数据库,根据模型创建模式,然后使用一个单独的./doctrine build-all-reload命令填充数据库。

它还包括支持数据库迁移,并最近更新了迁移功能以自动差异比较和生成迁移模型。

根据您的Doctrine投诉,您可以运行命令./doctrine generate-models-db./doctrine generate-yaml-db,从当前的数据库设置中自动生成模型和yaml文件。

其他方便之处包括“Behaviors”,在实现特定的模式时会使生活变得更容易。例如,您可以将“Timestampable”行为添加到类文件中。Doctrine会自动添加“created_at”和“updated_at”列,填充它们,并且每次运行$object->save()命令时都会自动更新“updated_at”列。更复杂的行为包括i18n、表版本控制和树(但实际上只有NestedSet)。

个人而言,我非常喜欢Doctrine,并且总是随机分享我的感受。


9

我使用一个名为redbean的鲜为人知的orm层。 你可以在这里找到它:http://www.redbeanphp.com。 它绝对是独一无二的,因为它可以自动创建表格、列和索引,而无需任何配置文件。我发现它可以大大节省时间!


6

Kohana 似乎是我正在寻找的东西。Zend 的活动记录不执行任何相互依赖项,事实上只会返回数组,而不是您可以操作或扩展功能的类。因此,目前为止 Kahana 看起来是胜利者。 - Zak
Zak,那不是真的。Zend的表方法返回Zend_Db_Table_Row或Zend_Db_Table_Rowset类型的对象。您可以扩展这些类。您可以在Zend_Db_Table类中声明对其他表的依赖关系。但无论如何——我相信Kahana对您的需求足够了。 - Bill Karwin
谢谢更新。我已确认您在Zend方面是正确的。(就像我从未怀疑过 ;) - Zak

5

我自己创建了一个没有冗余的版本。(虽然我需要更新我的现场资源)

我创建它时考虑到了你提到的所有要点:没有成堆的xml文件,没有庞大的框架,只有简单的构造函数和数据库属性映射,可以完成基本的CRUD / Find / Join操作。对于我大部分的工作,我甚至不需要编写自定义查询。

我以前在我的网站上已经写过所有这些内容,还请确保查看基本示例以了解其思想。

下一个版本将带有可行的一行加入加入(通过数据库中的“路径”进行遍历),基于ini的数据库设置,跨数据库支持,超级简单的数据库抽象和标准日志记录器,如果你的数据库出现问题,则回退到SQLite。

如果您对更新感兴趣,请告诉我,我会抓紧时间发布。

哦,还有别忘了,还有一个很棒的视觉脚手架生成器叫做Pork.Generator。它试图分析您的数据库结构并查找1:1、1:多和多:多关系,并可以自动生成类:-) 在数据库中找到的关系
(来源: schizofreend.nl)


4

Zend_Db_TableZend_Db_Table_Row非常适合您所描述的内容。您不需要任何配置文件,大多数元数据都是从数据库本身“发现”的。

从技术上讲,这些类没有实现ActiveRecord模式。相反,它们实现了Table Data GatewayRow Data Gateway模式。总体而言,这些模式提供了与ActiveRecord类似的价值,并且在某些方面比ActiveRecord更加灵活。

但是,像任何ORM一样,难免会有一些无法通过OO接口完成的SQL查询和操作。没有ORM可以作为一站式购物。

注:我曾在Zend Framework项目上工作了一年多,特别是在Zend_Db组件上。但是我现在已经不在他们那里工作了。


1
我会推荐在Symfony中使用Doctrine。尽管有更多要学习的,但您会发现一旦项目增长,它具备了您所需的功能(CRUD,表单框架,记录模板,DQL,插件支持,行为)。这两个项目都有非常活跃的社区,因此您不应该陷入死胡同,因为大多数问题已经在官方教程或论坛中得到解答。
如果您不喜欢在YAML中定义数据库,您可以始终使用 ORM设计师 或 MySQL Workbench。

1

检查可维护性框架。虽然我更喜欢代码生成而不是ActiveRecord(运行时反射),但我发现可维护性框架在ORM功能方面特别易于使用。

http://framework.maintainable.com/mvc/3_model.php#c3.7

如果您想使用基于代码生成的框架,可以尝试QCodo。无论dcousineau对Doctrine说了什么,我也可以对Qcodo说同样的话。这是一个仿照.NET / Delphi的事件驱动的全功能框架。但是您可以只使用代码生成功能,并找到将生成的类与框架的其他部分分离的方法。因此,您可以将生成的类嵌入到其他框架中。

1

另一个遵循 Ruby DataMapper 实现的选项是 phpDataMapper。它显然是一个数据映射器,而不是 ActiveRecord :)


0

0

http://dbphp.net

优点

  • 可以动态生成/修改数据库/表/字段/各种表/字段属性。
  • 无需安装。
  • 没有任何配置。
  • 只需要包含库并指定数据库链接参数即可开始工作。
  • 内置本地化支持。
  • 具有各种缓存级别,并允许扩展缓存引擎。
  • 可以同时与许多不同的数据库连接一起使用。
  • 可以在其他数据库服务器中的表之间建立关系。
  • 使用类和变量文档注释提取表/字段属性。

缺点

  • 仅适用于对象。即必须定义类并具有类实例才能保存、加载等。
  • 没有网站,但有示例文件夹。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接