对于现有的PHP应用程序,需要一个简单的ORM或DBAL

时间:2011-01-18 08:08:31

标签: php orm dbal notorm

我正致力于扩展现有的PHP应用程序。不幸的是,现有的应用程序是一团糟。这是所有带有原始mysql_ *调用的意大利面条代码。呻吟。我不会在我要扩展的部分中那样做。

所以,我正在寻找一个简单的DBAL ORM,我可以很容易地进入并开始使用。期望的功能:

  • 它必须适用于现有的数据库架构。优选地,具有最小配置或没有其他配现有的数据库模式与现有的PHP代码质量相同(没有合理的命名约定,没有规范化等)。我不想花费数天时间将数据库模式手动转换为带注释的对象属性a la Doctrine 2。
  • 它必须能够与现有的原始mysql_ *查询一起工作。我不知道当脚本手动操作数据库背后的数据时,像Doctrine 2或Propel这样的ORM如何表现,但我认为它并不漂亮。
  • 它必须在PHP 5.2.x上运行。我喜欢使用PHP 5.3,但我没有兴趣浏览现有的125K意大利面条代码,以确保它在PHP 5.3上运行。
  • 不需要关系。在我需要获取关系数据的少数几个地方,我很乐意拨打额外的find()query()或其他任何人。
  • 奖励积分,如果它有一些触发支持(例如beforeSaveafterSave)。不是要求,但很高兴。

编辑:有人让我摆脱了痛苦。我刚刚发现125K行的spaghetti代码也改变了数据库模式。例如,在某处添加一个额外的选项,并且一大堆ALTER TABLE语句开始飞行。我可以用这个代码库来填充一年的TheDailyWTF。所以,还有一个要求:

  • 必须能够自动处理不断变化的数据库架构(例如,添加列)。

我一直在寻找一些解决方案,但我不确定他们在满足要求的情况下会有多好。 Doctrine 2,RedBeanPhp等都需要PHP 5.3,所以它们都出来了。有一个用于PHP 5.2.x的旧版RedBeanPhp,但我不知道它是否适用于凌乱的现有数据库模式。 NotORM看起来可以用于获取数据,但我不知道它是否可以为现有数据库模式进行配置,以及如何轻松地将数据放回数据库。

理想情况下,我想要一些简单的事情。 E.g:

$user = User::find($id);
$user->name = 'John Woo';
$user->save();

或者:

$articles = ORM::find('article')->where('date' => '2010-01-01');
foreach ($articles as $article) {
    echo $article->name;
}

欢迎任何提示甚至替代解决方案!

2 个答案:

答案 0 :(得分:11)

我用... http://github.com/j4mie/idiorm/

它也以巴黎的形式实施了积极的记录。

关于你的编辑。 Idiorm应对不断变化的模式,语法几乎完全匹配您在问题中所需的类型。

答案 1 :(得分:1)

你对Doctrine的看法有多好?我正在使用Doctrine 1.2来做这些事情。非常容易设置,允许您从现有架构开始。它会自动计算出具有外键约束的表之间的关系。

它具有广泛的触发和行为支持,因此奖励积分也可以花费,并且它也有关系支持,因此您不需要额外的查询。它具有漂亮的延迟加载,并且它带有一种灵活的查询语言(称为DQL),它允许您完成几乎完全相同的东西,只需要花费一小部分精力就可以在SQL中完成。

您的示例将如下所示:

/* To just find one user */
$user = Doctrine::getTable('User')->findOneById($id);

/* Alternative - illustrating DQL */
$user = Doctrine_Query::create()
    ->from('User u')
    ->where('u.id = ?',array($id))
    ->fetchOne();

$user->name = 'John Woo';
$user->save();
  

它必须能够与现有的原始mysql_ *查询一起工作。当脚本手动操作数据库背后的数据时,我不知道像Doctrine 2或Propel这样的ORM如何表现,但我认为它并不漂亮。

嗯,这在技术上是不可能自动管理的; SQL数据库根本不会将内容推回到您的ORM,因此要更新后台更改的内容,您需要以某种方式执行其他查询。幸运的是,Doctrine让你很容易:

/* @var User $user */
/* Change a user using some raw mysql queries in my spaghetti function */
$this->feedSpaghetti($user->id);

/* Reload changes from database */
$user->refresh();