cocur/nqm

命名查询管理器帮助您在文件中组织SQL查询。

v0.4 2015-10-06 16:33 UTC

This package is auto-updated.

Last update: 2024-08-23 23:42:50 UTC


README

命名查询管理器 (NQM) 帮助您在文件中组织SQL查询。

Build Status Code Coverage

特性

  • 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 TABLECREATE 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 Support Florian

许可证

MIT许可证适用于 cocur/nqm。有关完整的版权和许可证信息,请查看与源代码一起分发的 LICENSE 文件。