【发布时间】:2016-09-08 14:51:17
【问题描述】:
我有一个旧项目以这种愚蠢的方式获取数据:
$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 的 DB 表),但问题是,我需要保留 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 类并重写它们,这样它们就不需要数据库连接,但我想看看这些是否已经完成。
【问题讨论】:
-
你的
Database类不能继承 Zend_Db_Table 类,覆盖fetchAll的方法,但仍然让它调用父fetch(在这种情况下,Zend_Db_Table::fetch)来检索数据? NB - 我不使用 ZendFrameworks,所以这纯粹是猜测。猜测工作,以及“手指在空中”的运气 -
@DaveyBoy 不幸的是,该项目的某些部分是非 OOP(SQL 查询),而其他部分则过于 OOP,因此
Database的继承树是DatabaseBaseDatabase BaseDb AbstractDb BaseObject AbstractObject 并且很难从其他东西继承。所以Database必须保持原样,因为我没有时间完全重写它。