【问题标题】:PHP SQL query Builder without DB connection没有数据库连接的 PHP SQL 查询生成器
【发布时间】: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_Tablethis 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 的继承树是 Database BaseDatabase BaseDb AbstractDb BaseObject AbstractObject 并且很难从其他东西继承。所以Database 必须保持原样,因为我没有时间完全重写它。

标签: php mysql


【解决方案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() 方法,可将列名和表名转换为其别名。


Zend extensionstandalone library 的形式提供。

【讨论】:

    【解决方案2】:

    这个项目似乎是你想要的:

    https://github.com/nilportugues/php-sql-query-builder

    唯一的遗憾是它需要 PHP 5.4 或更高版本。我面临同样的问题,除此之外,我的 PHP 需要为 5.3,这是我不使用它的唯一原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 2014-12-06
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多