我正在努力扩展现有的PHP应用程序。对我来说不幸的是,现有的应用程序是一团糟。所有带有RAW MySQL_*调用的意大利面条代码。呻吟。我绝不会在我要扩展的部分中这样做。

因此,我正在寻找一个简单的DBAL ORM,我可以轻松地开始使用。期望的功能:

  • 它必须在现有的数据库架构上工作。最好使用最小或没有其他配置。现有的数据库架构与现有的PHP代码的质量相同(没有明智的命名约定,未标准化等)。我不想花几天的时间将数据库架构手动转换为注释的对象属性a la toctrine 2。
  • 它必须能够与现有的RAW MYSQL_*查询一起工作。我不知道当脚本手动操纵背后数据库中的数据时,像学说2或Propel这样的保湿处理方法如何,但我认为这不是很漂亮。
  • 它必须在PHP 5.2.x上运行。 ID 要使用PHP 5.3,但我对浏览现有的125K线条代码杂物的兴趣为零,以确保其在PHP 5.3上运行。
  • 不需要关系。在我需要获取关系数据的几个地方,我很乐意致电一个额外的 find() 或者 query() 或我自己。
  • 如果奖励积分有一些触发支持(例如 beforeSave, afterSave)。不是必需的,而是很好。

编辑: :有人把我摆脱了痛苦。我刚刚发现,意大利面条代码的125K线也更改了数据库架构。例如,在某个地方添加一个额外的选项,以及一大批Alter表语句开始飞行。我可能可以用这个代码库来填补一年的thedailywtf。因此,还有一个要求:

  • 必须能够自动应对更改的数据库架构(例如,添加列)。

我一直在寻找一些解决方案,但是我不确定根据要求,它们的工作能力如何。学说2,redbeanphp等都需要php 5.3,因此它们已经出去了。有一个用于PHP 5.2.x的Redbeanphp的旧版本,但我不知道它是否可以使用凌乱的现有数据库架构。 Notorm看起来可以获取数据,但是我不知道是否可以为现有数据库架构配置它,以及如何轻松将数据放回数据库中。

理想情况下,我想要一些简单的东西。例如:

$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;
}

欢迎任何提示甚至其他解决方案!

有帮助吗?

解决方案

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

它也以巴黎的形式具有积极的记录实现。

关于您的编辑。白痴将更改架构和语法的更改几乎与您想要的类型完全匹配。

其他提示

您如何看待学说?我正在使用学说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();

它必须能够与现有的RAW MYSQL_*查询一起工作。我不知道当脚本手动操纵背后数据库中的数据时,像学说2或Propel这样的保湿处理方法如何,但我认为这不是很漂亮。

好吧,从技术上讲,这是不可能自动管理的; SQL数据库根本不会将内容推回ORM,因此要更新后台更改的内容,您需要以一种或另一种方式执行其他查询。幸运的是,学说对您来说非常容易:

/* @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();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top