【发布时间】:2011-06-22 04:08:15
【问题描述】:
我正在寻找 PHP 的查询构建引擎(not ORM!),它将满足下面指定的一些条件。不幸的是,在研究了 Doctrine、Propel、Adodb、Zend_Db 等之后,我找不到任何真正符合配置文件的东西——它们要么太抽象(我不需要 ORM 级别的抽象),要么不支持足够的特性.我需要的是一个库,它允许我以编程方式构建 SQL 查询——我什至不需要它来运行它,尽管那也可以。
我真的很想避免重新发明轮子,所以如果您知道符合个人资料的内容,请提出来。如果您认为上面提到的其中一个适合(我错过了),请也告诉我。
必须有(如果图书馆没有,它对我没用):
- 支持 PHP 5.2(不幸的是,命名空间库暂时不能使用)
- 支持程序化查询生成,包括select表达式、order-by、limit、group-by、have、union、outer join等。
- 支持 Mysql、Oracle oci8、MSSQL、DB2、Postrges
- 支持构建命名参数化查询和准备好的语句
- 支持随时动态添加条件/加入
- 支持日期时间等数据类型 - 例如,正确格式化传入/传出数据,在需要时使用正确的比较函数等(当然还有正确的引用)。我们知道代码中所有字段的类型,因此库应该允许我们告诉它每个字段是什么。
- 独立(易于使用,无需大量其他支持类)
- 易于扩展且许可允许以类似 BSD 的条款进行扩展
- 清理 PHP 5 代码(没有 PHP 4 object-by-ref cruft 等)
很高兴(我们可以在“必须拥有”的基础上实现它,但如果已经完成会更快乐)
- 支持实例化参数化查询(全部和部分) - 即在构建查询支持后为其提供部分参数并生成替换这些参数的新查询
- 支持合并两个查询(即将一个查询中的条件和表添加到另一个查询中)
- 支持查询 cmets(包括参数化)
奖金(这真的会让我们很开心,但我们现在可以没有它)
- 支持序列化
- 支持缓存
那么,有人知道这样的图书馆吗?
【问题讨论】:
-
请问Zend_Db什么被取消资格?它具有似乎符合您所描述内容的低级方法:
$select->from(..)->where(..)->groupBy(..)。它使用支持大多数(如果不是全部)指定数据库的 PDO,并且据我了解,它是相当独立的。 -
@Mike:它不支持数据类型 AFAIK,只支持位置参数,不支持命名参数。至少这是我从文档和代码中得到的。无论如何我都在考虑使用它并扩展它以支持它,但如果已经有它,我不想这样做。
-
我有一个库可以做到这一点。例如:
Person::name('billy')->join(Town::table(), Town::id(), SQL::OP_EQUAL, Persion::town_id())->group_by(Town::id())->select(SQL::count(Persion::id()), Town::all_fields()); -
@StasM 这应该可以工作:
$select->where('id = :user_id', array('user_id' => 123));。 Source -
@MikeB 我不确定它是否支持不进行命名绑定的后端。如果是,那么 ZF 只少了一个点,非常接近。
标签: php sql database database-abstraction