好的PHP ORM库?


268

是否有一个适用于PHP的良好的对象关系映射库?

我知道PDO / ADO,但是它们似乎仅提供数据库供应商之间差异的抽象,而不是域模型和关系模型之间的实际映射。我正在寻找一个PHP库,其功能类似于Hibernate针对Java和NHibernate针对.NET所做的方式。

Answers:



103

试试RedBean,它需要:

  • 没有配置
  • 没有数据库(它可以动态创建所有内容)
  • 没有型号
  • 等等

它甚至为您完成所有锁定和事务处理,并在后台监视性能。(哎呀!它甚至没有垃圾回收....)最重要的是......你没有写任何代码... ...线耶稣这样ORM层,救了我的屁股!


9
redbean是我曾经使用过的最好的数据库抽象层。不是“最好的之一”-最好的。
Nir Gavish 2010年

非常好找到。我非常欣赏这个ORM,至少可以说
克里斯托弗泰基尼



3
+1 +1 +1 +!+!!!!! ...耶稣,我阅读了文档的第一部分,这使我发狂地独裁者大笑,并且我已经在下载它了!
2012年

45

只有两个好人:教义Propel。我们赞成Doctrine,它与Symfony一起使用时效果很好。但是,如果您除了主要数据库之外还需要数据库支持,则必须编写自己的代码。


按php标准,Propel相当不错。它会生成相当干净的代码,该代码对IDE友好,并且具有getter和setter以及用于查询的非常干净的Criteria抽象系统。
0x6A75616E 2011年

由于这个问题与SO相关联很多,因此我想指出Propel从2020年起就是一个停产的项目。从未实现过PHP7兼容性。因此,选择Propel作为2020年一个新软件项目的ORM并不是一个好主意。
mrodo

34

Axon ORM是无脂肪框架的一部分 -它具有动态映射器。没有代码生成器。没有愚蠢的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)。不含脂肪仅55 KB。


15
当我看到$product->load('product_id=123')示例中的内容时,它总是让我感到担忧。
Znarkus 2011年

9
对于偏执狂,替代语法为$product->load(array('product_id=:id',array(':id'=>123)));
bcosca 2011年

4
Fat-Free还具有适用于MongoDB和平面文件的NoSQL ORM
bcosca

28

我一直在自己开发Pork.dbObject。(一个简单的PHP ORM和Active Record实现)主要是因为我发现大多数ORM太繁重。

Pork.dbObejct的主要思想是重量轻且易于设置。没有一堆XML文件,只有构造函数中的一个函数可以绑定它,还有addRelation或addCustomRelation可以定义与另一个dbObject的关系。

看看:Pork.dbObject


1
今天,我正在寻找一种轻量级的PHP ORM实现,并且由于这篇文章而发现了Pork.dbObject。效果很好!+1
E Dominique

6
杜德!这很有趣。我看到最新的更新发生在09年的某个地方。仍然保持吗?如果没有...我可能会复兴:)
VladFr 2010年

22

尝试Doctrine2。它可能是PHP中最强大的ORM工具。我将它与教义1分开提及,因为它是完全不同的软件。它是从头开始重写的,仍处于测试阶段,但是现在可以使用并开发了。

这是一个非常复杂的ORM,但设计合理。原始主义1的许多魔术消失了。它提供了一个完整的解决方案,您可以在Doctrine2之上编写自己的ORM或仅使用其一层


我可以想到的Doctrine2唯一的问题是它依赖于PHP 5.3及更高版本。
jblue 2010年

8
@jblue:这不是问题,这是一个功能;-)。像Doctrine这样的大型库需要名称空间。
汤姆·帕索里克(TomPažourek),2010年

“原始教义1中的很多魔术消失了。” —在什么方面是积极的?
Olivier'Ölbaum'Scherler 2011年

13

我只是从Kohana开始的,它似乎最接近Ruby on Rails,却没有像Propel那样调用多个配置文件的所有复杂性。


我也同意Kohana是PHP世界中与RoR最相似的框架。它所缺少的只是脚手架,而有了KO3中的CLI支持,这只是一个人卷起袖子并做到这一点的问题。
菲利普·惠兰

12

查看出口ORM。它比Propel和Doctrine更简单,并且与Hibernate相似,只是具有更多的PHP感觉。


3
我试过了 我必须在3个地方指定相同的对象属性-配置,模型和数据库模式。实施ORM IMO的工作量很大。
mixdev 2010年

插座非常笨重。
Lotus Notes

我已经试过了(1.0 RC1),即使在核心功能上也很麻烦。是的,有很多配置要编写。我不推荐。
SzymonWygnański2011年

11

我真的很喜欢Propel在这里您可以得到概述,文档非常好,并且可以通过PEAR或SVN获得。

您只需要有效的PHP5安装和Phing即可开始生成类。


Propel还可以对现有数据库架构进行“反向工程”-通过读取数据库架构来创建PHP对象。
David Goodwin



6

给一个镜头到宿舍,为PHP 5的对象关系映射。它支持各种关系(一对一),(一对多),(一对多)和数据类型。它是完全不干扰的:不需要代码生成或类扩展。在我看来,它比现有的ORM(包括Doctrine和Propel)都优越。但是,它仍处于测试阶段,并可能在接下来的几个月中发生重大变化。http://www.getdorm.com

它的学习曲线也很小。您将使用的三种主要方法是:

<?php 
$object = $dorm->getClassName('id_here');
$dorm->save($object);
$dorm->delete($object);

4

我目前正在研究phpDataMapper,这是一个ORM,旨在具有简单的语法,例如Ruby的Datamapper项目。它也仍处于早期开发中,但是效果很好。


4

我在Idiorm和巴黎有过丰富的经验。Idiorm是一个小型,简单的ORM库。巴黎是一个基于Idiorm的同等简单的Active Record实现。适用于具有PDO的PHP 5.2+。如果您只需要简单的东西就可以放入现有应用程序中,那将是一个完美的选择。


4

是的,我已经使用它一段时间了。虽然功能强大,但是ORM仍有很多工作要做。使用具有其他属性或外键的联接表,创建新对象可能有点乏味。使用简单模型很容易。看一下Repose ORM或Outlet,了解PHP的替代ORM。
迈克尔

3

在PHP 5.3发行之前,不要指望拥有良好的ORM。这是PHP的OO限制。


那么PHP 5.3如何帮助某人编写更好的ORM?我没看到任何原因。
Ionuț G. Stan,

8
主要原因是引入了后期静态绑定(“ static”关键字)。在blog.felho.hu/…
knoopx

2
ORM确实不需要静态变量,可以仅使用实例变量对其进行精心设计。
汤姆·帕索里克(TomPažourek),2010年

确实,后期静态绑定是我可以将自己的ORM的每个ORM实例设置得如此低的原因。在后期静态绑定之前,它和大多数其他资源一样浪费。
Xeoncross

3

我和我的朋友Kien改进了他在PHP 5.3之前编写的ORM的早期版本。我们基本上已经将Ruby on Rails的Active Record移植到了PHP。它仍然缺少我们想要的一些关键功能,例如事务,复合主键支持,更多的适配器(目前仅MySQL和SQLite 3可用)。但是,我们非常接近完成这些工作。您可以看看PHP ActiveRecord和PHP 5.3


3

试试PHP ADOdb。

我不能说这是最好的,因为我没有用过其他东西。但是它很快,它支持Memcached和缓存。

而且它比Zend Framework的 DB / Select 更快。


2
adodb更适合Thin Model / Fat Controller风格,这通常不是一件好事。
jblue 2010年

ADOdb具有一个ORM(但不仅仅是一个ORM)。通常,这是一个非常好的解决方案,它比Zend对DB的工作要好得多(并且比ADOdb慢,Zend DB仅对JOIN支持有限),它支持通过参数化自动转义(与Doctrine不同),许多不同的DB后端和具有出色的可扩展缓存设计以及超简单的Memcache集成。我认为说它自己适合“瘦模型/胖控制器”实现是完全不正确的(您可以做到这一点,但ADOdb的设计不赞成任何一种方式)。
伊恩·柯林斯

3

看看KohanaLEAP ORM。它可以与许多数据库一起使用,包括DB2DrizzleFirebirdMariaDB,SQL Server,MySQL,Oracle,PostgreSQLSQLite。通过简单的自动加载功能,它几乎可以与任何PHP框架一起使用。源代码位于GitHub上的https://github.com/spadefoot/kohana-orm-leap。您可以在线查看LEAP的教程

ORM库与非整数主键和组合键一起使用。连接是通过数据库连接池管理的,并且可以与原始SQL查询一起使用。ORM甚至有一个查询生成器,使构建SQL语句超级简单。


2

如果您喜欢冒险,可以查看Repose。就像Outlet一样,它是以Hibernate为原型的。

它的开发仍处于初期阶段,但是到目前为止,对域模型的唯一限制是这些类未标记为final且属性未标记为private。一旦进入PHP> = 5.3领域,我还将尝试实现对私有属性的支持。


2

如果您正在寻找一种实现Data Mapper范式而不是专门针对Active Record的ORM,那么我强烈建议您看一下GacelaPHP

Gacela功能:

  • 数据映射器
  • 外键映射
  • 关联映射
  • 相关映射
  • 具体表继承
  • 查询对象
  • 元数据映射
  • 延迟加载
  • 完整的Memcached支持

在开发任何复杂的远程产品时,其他ORM解决方案过于肿或具有繁重的局限性。Gacela通过实现数据映射器模式解决了活动记录方法的局限性,同时通过使用PDO与数据库和Memcached进行所有交互来最大限度地减少膨胀。


2

MicroMVC有一个13 KB的ORM,它仅依赖于8 KB的数据库类。它还将所有结果作为ORM对象本身返回,并使用后期静态绑定来避免将有关当前对象表和元数据的信息嵌入到每个对象中。这导致存在最便宜的ORM开销。

它适用于MySQLPostgreSQLSQLite



2

敏捷工具包拥有自己独特的ORM / ActiveRecord和动态SQL实现

简介:http//agiletoolkit.org/intro/1

语法(活动记录):

$emp=$this->add('Model_Employee');
$emp['name']='John';
$emp['salary']=500;
$emp->save();

语法(动态SQL):

$result = $emp->count()->where('salary','>',400)->getOne();

尽管可以直接使用Dynamic SQL和Active Record / ORM,但Agile Toolkit进一步将它们与用户界面和jQuery UI集成在一起。这类似于JSF,但使用纯PHP编写。

$this->add('CRUD')->setModel('Employee');

这将显示AJAXified CRUD和Employee模型。


2

非ORM

include "NotORM.php";
 $pdo = new PDO("mysql:dbname=software");
 $db = new NotORM($pdo);
 $applications = $db->application()
->select("id, title")
->where("web LIKE ?", "http://%")
->order("title")
->limit(10)
;
foreach ($applications as $id => $application) {
echo "$application[title]\n";
}

2

用于PDO扩展的PHP ORM Faces。参见PHP Faces Framework

$urun = new Product();
$urun->name='CPU'
$urun->prince='124';
$urun->save();

1.网站为土耳其语;2.您的代码与您将使用的代码(例如,Doctrine)没有什么不同。
Pellmeister 2011年


1

我们使用的另一个很棒的开源PHP ORM是PHPSmartDb。它很稳定,使您的代码更安全,更整洁。其中的数据库功能是我曾经与PHP 5.3一起使用过的最简单的功能。



1

如果您正在寻找像Hibernate这样的ORM,则应该查看PMO

可以轻松地将其集成到SOA架构中(只有一个Web服务类可以开发)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.