mouf/magic-query

一个非常有用的库,可以帮助您处理SQL:生成具有可变参数数量的预编译语句,自动写入连接...等等!

v2.0.0-beta.2 2024-06-08 14:56 UTC

README

Latest Stable Version Latest Unstable Version License Scrutinizer Code Quality Build Status Coverage Status

什么是Magic-query?

Magic-query是一个PHP库,帮助您处理复杂的SQL查询。

它具有3个非常棒的功能

安装

只需使用composer包

{
	"require": {
		"mouf/magic-query": "^1.2"
	},
	"minimum-stability": "dev",
	"prefer-stable": true
}

使用MagicParameters自动丢弃未使用的参数

只需写出所有可能的参数的查询。

use Mouf\Database\MagicQuery;

$sql = "SELECT * FROM users WHERE name LIKE :name AND country LIKE :country";

// Get a MagicQuery object.
$magicQuery = new MagicQuery();

// Let's pass only the "name" parameter
$result = $magicQuery->build($sql, [ "name" => "%John%" ]);
// $result = SELECT * FROM users WHERE name LIKE '%John%'
// Did you notice how the bit about the country simply vanished?

// Let's pass no parameter at all!
$result2 = $magicQuery->build($sql, []);
// $result2 = SELECT * FROM users
// The whole WHERE condition disappeared because it is not needed anymore!

好奇它是如何工作的吗?查看参数指南!

使用MagicJoin自动猜测JOIN!

厌倦了在SQL中编写JOIN?让MagicQuery为您做这项工作!

真的吗?是的!您只需做的是

  • 将一个 Doctrine DBAL连接 传递给MagicQuery构造函数。MagicQuery将分析您的模式。
  • 在您的SQL查询中,用 magicjoin(start_table) 替换表
  • 对于查询的每个列,使用完整的名称(例如 [table_name].[column_name],而不是仅使用 [column_name])

假设您的数据库模式是

Sample database schema

使用MagicJoin,您可以写出这个SQL查询

SELECT users.* FROM MAGICJOIN(users) WHERE groups.name = 'Admins' AND country.name='France';

并且它将自动转换为这个

SELECT users.* FROM users 
	LEFT JOIN users_groups ON users.user_id = users_groups.user_id
 	LEFT JOIN groups ON groups.group_id = users_groups.group_id
 	LEFT JOIN country ON country.country_id = users.country_id
WHERE groups.name = 'Admins' AND country.name='France';

代码如此简单!

use Mouf\Database\MagicQuery;

$sql = "SELECT users.* FROM MAGICJOIN(users) WHERE groups.name = 'Admins' AND country.name='France'";

// Get a MagicQuery object.
// $conn is a Doctrine DBAL connection.
$magicQuery = new MagicQuery($conn);

$completeSql = $magicQuery->build($sql);
// $completeSql contains the complete SQL request, with all joins.

想了解更多?查看MagicJoin指南!

在您的SQL查询中使用Twig模板!

丢弃未使用的参数和自动连接键还不够?您有非常具体的需求?欢迎使用Twig集成!

使用Twig集成,您可以直接将Twig条件添加到SQL中。

use Mouf\Database\MagicQuery;

$sql = "SELECT users.* FROM users {% if isAdmin %} WHERE users.admin = 1 {% endif %}";

$magicQuery = new MagicQuery();
// By default, Twig integration is disabled. You need to enable it.
$magicQuery->setEnableTwig(true);

$completeSql = $magicQuery->build($sql, ['isAdmin' => true]);
// Parameters are passed to the Twig SQL query, and the SQL query is returned.
注意! Twig集成不能用于将参数插入到SQL查询中。您应该使用经典SQL参数。这意味着,如果写入 {{ id }},则应编写 :id

想了解更多?查看MagicTwig指南!

这是一个仅适用于MySQL的工具吗?

不是。默认情况下,您的SQL将使用MySQL方言进行解析和重写,但您可以使用Doctrine DBAL知道的任何类型的方言。Magic-query可选地使用Doctrine DBAL。您可以将一个Connection对象作为MagicQuery构造函数的第一个参数传递。Magic-query将使用匹配的方言。

例如

$config = new \Doctrine\DBAL\Configuration();
$connectionParams = array(
    'url' => 'sqlite:///somedb.sqlite',
);
$conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams, $config);

$magicQuery = new \Mouf\Database\MagicQuery($conn);

此外,如果您未配置数据库连接,但想使用特定的方言生成SQL,您还可以设置DBAL数据库平台

$magicQuery->setOutputDialect(new \Doctrine\DBAL\Platforms\PostgreSqlPlatform());
$magicQuery = new \Mouf\Database\MagicQuery();

关于性能如何?

MagicQuery会对您的查询执行很多操作。它将解析它,将其内部表示为SQL节点树等。这种处理是耗时的。因此,您绝对应该考虑使用缓存系统。MagicQuery与Doctrine Cache兼容。您只需将Doctrine Cache实例作为构造函数的第二个参数传递。

use Mouf\Database\MagicQuery;
use Doctrine\Common\Cache\ApcCache;

// $conn is a Doctrine connection
$magicQuery = new MagicQuery($conn, new ApcCache());

有任何问题吗?

使用MagicQuery,您的SQL查询会发生很多变化。特别是,它使用php-sql-parser库的修改版本进行解析。如果您在复杂查询中遇到任何问题,可能是在解析器中存在错误。请打开Github上的一个问题,我们将尝试修复它。