prelude / prelude-database
基于PDO构建的数据库无关抽象集
Requires
- php: >=5.3
- prelude/prelude: *
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)
用于将参数绑定到内部的 PDOStatementbindParams(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。
反馈?
请尝试一下,并告诉我您的看法!