prelude/prelude-database

此包已被废弃且不再维护。未建议替代包。

基于PDO构建的数据库无关抽象集

0.0.3 2014-07-21 22:40 UTC

This package is auto-updated.

Last update: 2018-12-14 20:51:16 UTC


README

此库提供了一个简化接口,用于访问常见的PDO惯用方法。这不是一个SQL生成工具,实际上,我们期望您提供...

  • SQL查询字符串
  • 查询参数

安装

composer.json

{
    "require": {
        "prelude/prelude-database": "*"
    }
}

有关详细信息,请参阅 packagist

DSN

PDO提供了一个很好的API来以标准方式访问数据库,但连接部分仍然使用字符串处理;并且这些是供应商特定的

DSN通过提供一致的API来读取配置,然后提供连接的PDO对象,从而提供了一个简单标准来处理这些差异。

它简单地不干扰您,同时与其他工具很好地集成

读取配置

# read from url
$dsn = DsnParser::parseUrl('pgsql://user:pass@host:port/database');
# .. or from the enviroment
$dsn = DsnParser::parseEnv('DATABASE_URL');
# .. or from file
$dsn = DsnParser::parseFile('path/to/config/db.php'); // support reading urls or arrays

# .. which under the hood all it does is:
$dsn = new Dsn([
    'driver' => Dsn::MYSQL,
      'host' => 'locahost',
    'dbName' => 'app-db'
]);

数据库连接

要打开到数据库的连接,只需调用$dsn->connect()。它将返回一个PDO实例。

$pdo = $dsn->connect();
// .. which actually does
$pdo = new PDO($dsn->toString(), $dsn->user, $dsn->pass);

可选地,您可以传递一个用于PDO的驱动程序参数数组。

// with parameters:
$pdo = $dsn->connect([
    PDO::ATTR_PERSISTENT => true,
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

查询构建器

构建Query实例的流畅接口。

查询构建器处理了与准备好的语句一起工作的内部问题和陷阱。它要求您提供完整的SQL查询字符串,然后它将提供一个完全配置的PDOStatement,准备好执行或检索结果。

$builder = new QueryBuilder($pdo);
$builder->setQuery('SELECT * FROM FizzBuzz where :foo > ? and :bar == :baz')
        ->setParam('foo', $foo)
        ->setParam(0, $p0)
        ->setParams(['bar' => $bar,
                     'baz' => $baz])
        ->fetchObject(FizzBuzz::CLASS);

try {
    // execute() returns a PDOStatement -- or throws
    foreach ($builder->execute() as $row) {
        // $row instanceof FizzBuzz;
    }
} catch (\PDOException $e) {
    var_dump($e); // execute() failed
}

// Need fine tune? just access the internal PDO instance!
$pdoStmt = $builder->getStatement();

SQL查询

$builder->setQuery('SELECT * FROM table');
echo $builder->getQuery(); // outputs " SELECT *... "

参数和参数

$builder->setQuery('SELECT * FROM table WHERE :foo > ?');

$builder->setParam('foo', $foo); // sets the `:foo` param
$builder->setParam(0, $zero);    // sets the first `?` argument

// or simply pass them all
$builder->setParams([$zero, 'foo' => $foo]);

// need the values back?
$builder->getParams();
$builder->getParam(string|int);

// want to clear them?
$builder->setParams(null);

在将值绑定到PDOStatement(如绑定无效值)时存在一些陷阱。QueryBuilder将在需要构建实际查询时处理这些值;因此,您的值在构建过程中保持未修改。您不需要特别关注这些边缘情况,并安全地绑定值。

获取模式

QueryBuilder提供了一个更简单的获取方法。

  • fetchObject([string $class = null [, array $ctoArgs = null]])以对象的形式获取结果。您还可以传递类名及其构造函数参数。
  • fetchArray(void)以关联数组的形式获取结果
  • fetchList(void)以0索引的位置数组的形式获取结果
  • fetchScalar(int|string $column = 0)获取给定列的标量值

需要微调? setFetchMode(int $mode[, $arg1[, $arg2, ...]]) 其中 $mode\PDO::FETCH_* 常量之一。

示例

    $builder->fetchObject();
    // --> each record will be a `StdObject`
    $builder->fetchObject(User::CLASS, [$foo, $bar])
    // --> will call new User($foo, $bar) for each result

    $mode = $builder->getFetchStyle(); // \PDO::FETCH_CLASS;

Query(PDOStatement $stmt[, array $params])

Query充当一个小包装器,用于增强PDOStatement。您可能不需要直接与这些实例交互,除非需要精细控制的情况,例如多次运行相同的查询。

虽然库的初衷是使用 QueryBuilder::build 构建查询实例,但没有任何阻止您按需手动创建实例。它的API设计得非常好,可以与其他组件良好协作。

此类提供非常基本的功能

  • bindParam(array $param, $value) 用于将参数绑定到内部的 PDOStatement
  • bindParams(array $params) 用于绑定一组参数
  • execute([array $params = null]) 可选地绑定参数,然后执行 PDOStatement
$query = new Query(
    $pdo->prepare('INSERT INTO pos(x, y) VALUES(:x, :y)')
);

$query->execute(['x' => 0, 'y' => 0]);
$query->execute(['x' => 1, 'y' => 1]);
$query->execute(['x' => 1, 'y' => 2]);
...
$query->execute(['x' => 9, 'y' => 9]);

检索记录

此库的一个核心设计理念是保持简洁,这就是为什么 Query::execute 会返回 PDOStatment,让您决定如何检索记录。

想要以按需、懒加载、高效的方式检索结果?请查看 Prelude\Iterators\Records

反馈?

请尝试一下,并告诉我您的看法!