cocur / nqm
命名查询管理器帮助您在文件中组织SQL查询。
Requires
- php: >=5.4
Requires (Dev)
- jimbojsb/pseudo: dev-master
- mikey179/vfsstream: ~1.2
- mockery/mockery: ~0.9
- phpunit/phpunit: ~4.0
- sami/sami: ~1.3
- satooshi/php-coveralls: dev-master
README
命名查询管理器 (NQM) 帮助您在文件中组织SQL查询。
特性
- PDO包装器
- 将查询存储在文件系统中
- 使用数组或APC缓存查询
- 兼容PHP >= 5.4和HHVM
安装
您可以使用Composer安装cocur/nqm
。
$ composer require cocur/nqm:@stable
提示:使用具体的版本而不是@stable
。
用法
为了使用NQM,您需要使用一个实例的\PDO
和一个查询加载器初始化Cocur\NQM\NQM
类。NQM自带一个文件系统查询加载器。
use Cocur\NQM\NQM; use Cocur\NQM\QueryLoader\FilesystemQueryLoader; $loader = new FilesystemQueryLoader(__DIR__.'/queries'); $pdo = new \PDO(...); $nqm = new NQM($pdo, $loader);
初始化NQM
对象后,您可以使用它。目前,该类有三个公开方法用于检索查询、准备语句或执行语句。
以下命令将返回存储在./queries/find-all-users.sql
中的SQL查询。
$nqm->getQuery('find-all-users');
NQM也可以直接返回一个\PDOStatement
对象。
$stmt = $nqm->prepare('find-all-users'); $stmt->execute();
或者您可以直接执行语句
$stmt = $nqm->execute('find-user-by-id', [':id' => 42]);
查询缓存
为了加快查询加载速度,您可以使用Cocur\NQM\QueryLoader\CacheQueryLoader
来缓存查询。缓存类实现了与其他查询加载器相同的接口,构造函数接受一个QueryLoaderInterface
实例。如果查询不存在于缓存中,缓存将使用此加载器来加载查询。例如:
use Cocur\NQM\QueryLoader\CacheQueryLoader; use Cocur\NQM\QueryLoader\FilesystemQueryLoader; $loader = new FilesystemQueryLoader(__DIR__.'/queries'); $cache = new CacheQueryLoader($loader); $pdo = new \PDO(...); $nqm = new NQM($pdo, $cache);
APC查询缓存
CacheQueryLoader
查询加载器将缓存查询存储在数组中,因此仅基于每个请求。虽然这在CLI应用程序中通常足够,但对于Web应用程序来说,最好跨多个请求缓存查询。
use Cocur\NQM\QueryLoader\ApcQueryLoader; use Cocur\NQM\QueryLoader\FilesystemQueryLoader; $loader = new FilesystemQueryLoader(__DIR__.'/queries'); $apc = new ApcQueryLoader($loader); $pdo = new \PDO(...); $nqm = new NQM($pdo, $apc);
此外,如果您在单个请求中多次使用查询,您可以堆叠多个查询加载器。在以下示例中,NQM将首先从数组缓存中加载查询,如果未缓存,则从APC缓存中查找。作为最后的手段,NQM将从文件系统中加载查询。
use Cocur\NQM\QueryLoader\ApcQueryLoader; use Cocur\NQM\QueryLoader\CacheQueryLoader; use Cocur\NQM\QueryLoader\FilesystemQueryLoader; $loader = new FilesystemQueryLoader(__DIR__.'/queries'); $apc = new ApcQueryLoader($loader); $cache = new CacheQueryLoader($apc); $pdo = new \PDO(...); $nqm = new NQM($pdo, $cache);
数组查询加载器
将查询存储在数组中。
use Cocur\NQM\QueryLoader\ArrayQueryLoader; $loader = new ArrayQueryLoader(['foo' => 'SELECT ...;']);
查询集合
有时您有多个始终一起执行的查询。例如,一个DROP TABLE
、CREATE TABLE
序列,或者如果您必须为特别复杂的查询创建临时表。由于PDO每次只能接受一个SQL语句,因此您可以使用QueryCollection
来执行多个查询。查询必须由#;
分隔,并且必须放在单独的一行上。
DROP TABLE IF EXISTS users; #; CREATE TABLE users (...);
use Cocur\NQM\QueryCollection; $collection = NQMQueryCollection($nqm); // Just prepare the statements $statements = $collection->prepare('drop-and-create-user-table'); // Prepare and execute the statements $statements = $collection->execute('drop-and-create-user-table', ['foo'=>'bar']);
prepare()
和execute()
方法都返回一个Cocur\NQM\StatementCollection
。这个集合类实现了\ArrayAccess
和\Countable
。
$statements->all(); // -> \PDOStatement[] $statements->first(); // -> \PDOStatement $statements->last(); // -> \PDOStatement
Doctrine桥梁
如果您没有PDO
对象,但有Doctrine EntityManager
对象,您可以使用Doctrine桥梁来创建一个新的NQM
对象。
use Cocur\NQM\Bridge\Doctrine\NQMFactory; $nqm = NQMFactory::createFromEntityManager($entityManager, $queryLoader); // NQM(...) object
变更日志
版本 0.4 (2015年10月6日)
- 添加
ArrayQueryLoader
版本 0.3 (2015年2月16日)
- 添加对查询集合的支持
版本 0.2 (2015年2月11日)
- 添加Doctrine桥梁
版本 0.1.2 (2015年2月3日)
- 将开发包移动到
composer.json
中的require-dev
版本 0.1.1 (2014年8月26日)
- 重命名查询加载器类名
版本 0.1 (2014年5月28日)
- 初始发布
作者
Florian Eckerstorfer 
许可证
MIT许可证适用于 cocur/nqm
。有关完整的版权和许可证信息,请查看与源代码一起分发的 LICENSE 文件。