我有一个以愚蠢的方式获取数据的旧项目:
$db = new Database($server, $name, $pass);
$where = 'country = "UK"';
if ($_GET['gender']) { $where .= ' AND gender = "' . $_GET['gender'] . '"'; }
$sql = "SELECT * FROM users WHERE $where ORDER BY name";
$users = $db->fetchAll($sql);
我想用SQL构建器(在我使用Zend的数据库表的其他项目上)改进它,但问题是,我需要保留Database
类,因为它的fetch*()
方法不仅仅是只是加载数据(例如调试,性能,统计等)。
我查看了Zend_Db_Table
和this post,但所有这些查询构建器都附加到具有自己的fetch()
或execute()
方法的数据库连接器。但我需要一个只能创建可在现有方法中使用的SQL查询的构建器:
$query = new MySqlQuery();
$query
->select('*')
->from('users')
->orderBy('name')
->where('country', 'UK');
if ($_GET['gender']) {
$query->where('gender', $_GET['gender']);
}
$sql = $query->toString();
$db = new Database($server, $name, $pass);
$users = $db->fetchAll($sql);
我在考虑简单地窃取Zend类并重写它们以便它们不需要数据库连接,但我想看看这些是否已经完成。
答案 0 :(得分:1)
我已经创建了不需要与数据库进行有效连接的修改后的Zend_Db_Select
。
require_once 'Zend/Db/Query/Mysql.php';
$query = new Zend_Db_Query_Mysql();
$query
->from(array('a' => 'articles'))
->columns(array('id', 'text' => 'content_text'))
->joinLeft('authors',
$query->column('author', 'articles', new Zend_Db_Expr('authors.id'))
)
->where($query->column('archived', 'articles', 0))
->order(new Zend_Db_Expr($query->column('release_time', 'articles') . ' DESC'))
;
$sql = $query->assemble();
作为奖励,我添加了column()
方法,将列名和表名转换为别名。
答案 1 :(得分:0)
这个项目似乎是你想要的:
https://github.com/nilportugues/php-sql-query-builder
唯一令人沮丧的是它需要PHP 5.4或更高版本。我面临同样的问题,最重要的是我的PHP需要为5.3,这是我不使用它的唯一原因。