PHP有好的对象关系映射库吗?

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


当前回答

我的朋友Kien和我对他在PHP 5.3之前编写的ORM的早期版本进行了改进。我们实际上已经将Ruby on Rails的活动记录移植到PHP。它仍然缺少一些我们想要的关键特性,比如事务,复合主键支持,更多的适配器(目前只有MySQL和SQLite 3可用)。但是,我们已经非常接近完成这些工作了。你可以看看带有PHP 5.3的PHP ActiveRecord。

其他回答

我的朋友Kien和我对他在PHP 5.3之前编写的ORM的早期版本进行了改进。我们实际上已经将Ruby on Rails的活动记录移植到PHP。它仍然缺少一些我们想要的关键特性,比如事务,复合主键支持,更多的适配器(目前只有MySQL和SQLite 3可用)。但是,我们已经非常接近完成这些工作了。你可以看看带有PHP 5.3的PHP ActiveRecord。

教条主义可能是你最好的选择。在Doctrine之前,DB_DataObject本质上是唯一一个开源的实用程序。

好的只有两个:Doctrine和Propel。我们喜欢Doctrine,它和Symfony配合得很好。然而,如果你正在寻找数据库支持之外的主要,你将不得不编写自己的代码。

Axon ORM是Fat-Free Framework的一部分-它具有一个动态映射器。没有代码生成器。没有愚蠢的XML/YAML配置文件。它直接从后端读取数据库模式,因此在大多数CRUD操作中,您甚至不需要扩展基本模型。它适用于所有主要pdo支持的数据库引擎:MySQL, SQLite, SQL 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只有55kb。

Doctrine2试试。它可能是最强大的PHP ORM工具。我把它和教义一分开提,因为它是完全不同的软件。它是从头重写的,仍然处于测试阶段,但现在已经可以使用了。

这是一个非常复杂的ORM,但设计得很好。第一条教义中的很多魔法都消失了。它提供了一个完整的解决方案,您可以在Doctrine2的基础上编写自己的ORM,也可以只使用其中的一个层。