好用的PHP ORM库?

267

有没有适用于PHP的好的对象关系映射库?

我知道 PDO/ADO,但它们似乎只提供了对不同数据库厂商之间差异的抽象,并没有提供领域模型和关系模型之间实际的映射。我正在寻找一种类似于Java中的Hibernate 或 .NET 中的 NHibernate 的 PHP 库。

36个回答

122

107

试试RedBean,它需要:

  • 无需配置
  • 无需数据库(它会动态创建)
  • 无需模型
  • 等等

它甚至可以为您处理所有锁定和事务,并在后台监视性能。(它甚至可以进行垃圾回收...)最重要的是... 您不必编写任何代码... 天啊thisORM层,救了我的命!


10
毫无疑问,Redbean是我曾经使用过的最好的数据库抽象层,不仅是“最好之一”,而是最好的。 - Nir Gavish
6
但是:https://dev59.com/LE7Sa4cB1Zd3GeqP8PYq - Sirber
1
比较RedBean和Doctrine:http://stackoverflow.com/questions/8063640/redbean-vs-doctrine/ - PiTheNumber
3
+1 +1 +1 +! +! !!!!...天啊,我读了文档的前面部分,让我发出了邪恶的独裁者笑声,我已经在下载它了! - KJW
1
我真的不想泼冷水,但这违背了我所知道的一切——数据库表应该经过精心设计(以提高性能),而ALTER TABLE调用是昂贵的(并且可能很危险)。 - Nicole
显示剩余5条评论

47

只有两种好的选项: DoctrinePropel。我们更倾向于使用Doctrine,并且它与Symfony兼容良好。但是,如果您需要除主要数据库之外的支持,您将不得不编写自己的代码。


Propel在PHP标准下表现得相当不错。它能生成相对清晰的代码,且对IDE友好,具备访问器和设置器,并且拥有非常干净的查询抽象系统。 - 0x6A75616E
3
由于这个问题在 Stack Overflow 上经常被链接,我想指出 Propel 从2020年起已经停止维护。它从未实现 PHP7 兼容性。因此,在2020年选择 Propel 作为新软件项目的 ORM 不是一个好主意。 - mrodo
我已经使用Doctrine几年了,但我讨厌它。不是因为它不能工作,而是因为它非常臃肿,占用内存多,速度慢,并且在后台执行操作时会生成大量的数据库查询。它确实可以工作,但你将花费很多时间学习它和它的细微差别,如果你有大型依赖数据集,这些细节会非常令人沮丧。毫无疑问,Doctrine被广泛使用,但如果我今天选择一个ORM,Doctrine不会是我的第一选择,甚至不是第二选择...JM5C。 - WebTigers
2
@mrodo Propel并没有停止开发。Propel 2版本仍在为PHP 7.2及以上版本进行积极开发。 - bigtunacan

34
Axon ORM是Fat-Free Framework的一部分 - 它具有即时映射器。没有代码生成器。没有愚蠢的XML/YAML配置文件。它直接从后端读取数据库模式,因此在大多数CRUD操作中,您甚至不必扩展基本模型。它适用于所有主要的PDO支持的数据库引擎:MySQLSQLiteSQL Server/Sybase,Oracle,PostgreSQL等。
/* SQL */
CREATE TABLE products (
    product_id INTEGER,
    description VARCHAR(128),
    PRIMARY KEY (product_id)
);

/* PHP */
// Create
$product=new Axon('products'); // Automatically reads the above schema
$product->product_id=123;
$product->description='Sofa bed';
$product->save(); // ORM knows it's a new record

// Retrieve
$product->load('product_id=123');
echo $product->description;

// Update
$product->description='A better sofa bed';
$product->save(); // ORM knows it's an existing record

// Delete
$product->erase();

最重要的是,插件和附带的SQL数据访问层与框架一样轻巧:14 KB(Axon)+ 6 KB(SQLdb)。Fat-Free只有55 KB。


18
当我在示例中看到类似于 $product->load('product_id=123') 的代码时,我总是感到担忧。 - Markus Hedlund
10
对于偏执者,可选择使用替代语法:$product->load(array('product_id=:id',array(':id'=>123))); - bcosca
4
Fat-Free同样拥有适用于MongoDB和平面文件的NoSQL ORM。 - bcosca

28

我一直在独自开发Pork.dbObject(一个简单的PHP ORM和Active Record实现)。主要原因是我发现大多数ORM都太复杂了。

Pork.dbObject的主要思想是轻量级且易于设置。没有一堆XML文件,只需要在构造函数中调用一个函数来绑定它,并使用addRelation或addCustomRelation定义与另一个dbObject的关系。

看一看这个:Pork.dbObject


1
今天我在寻找一个轻量级的PHP ORM实现,通过这篇文章我发现了Pork.dbObject。它非常好用!+1 - E Dominique
6
哥们!这相当有趣。我看到最新的更新是在09年发生的。它还在维护吗?如果不是的话,我可能会让它复活 :) - VladFr

22

尝试使用Doctrine2。它可能是PHP中最强大的ORM工具。我之所以将其与Doctrine 1分开提到,是因为它是完全不同的软件。它已经从零开始重写,仍处于测试阶段,但现在可以使用并进行开发。

它是一个非常复杂的ORM,但设计良好。原始的Doctrine 1魔法非常多已经消失。它提供了完整的解决方案,您可以在Doctrine2上编写自己的ORM或仅使用其层之一


我能想到 Doctrine2 唯一的问题是它依赖于 PHP 5.3 及以上版本。 - jblue
8
没问题,这是一项特性 ;-). 像Doctrine这样的大型库需要使用命名空间。 - Tom Pažourek
“原始Doctrine 1中的许多魔法已经消失。” — 这在哪方面是积极的? - Olivier 'Ölbaum' Scherler

13

我刚开始学习Kohana,它似乎是最接近Ruby on Rails的PHP框架,且没有像Propel那样需要配置多个文件。


我也认同 Kohana 是 PHP 世界中最接近 RoR 的框架。它唯一缺少的就是脚手架,而随着 KO3 中 CLI 支持的加入,只需要有人挽起袖子去做就可以了。 - Phillip Whelan

12

我非常喜欢Propel这里可以了解概览信息,文档相当不错,你可以通过PEAR或SVN获取它。

你只需要一个可工作的PHP5安装和Phing,就可以开始生成类文件。


Propel还可以“反向工程”现有的数据库模式 - 通过读取数据库模式创建PHP对象。 - David Goodwin

11

看看Outlet ORM。它比Propel和Doctrine更简单,类似于Hibernate,只是带有更PHP化的感觉。


3
我试过这个。我不得不在3个地方指定相同的对象属性 - 配置、模型和数据库结构。在我看来,为了实现ORM这需要很多工作。 - mixdev
Outlet 配置非常繁琐。 - Lotus Notes
我尝试过这个(1.0 RC1),即使在核心功能中也非常容易出现错误。是的,需要编写很多配置。我不建议使用它。 - Szymon Wygnański

8

我在PHP库Flourish中找到了与ORM相关的类。


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