mouf/database.querywriter

此软件包包含用于生成SQL语句(如SELECT查询等)的类...

v4.1.0 2018-10-23 15:01 UTC

This package is auto-updated.

Last update: 2024-09-15 04:52:29 UTC


README

QueryWritter 是一个PHP库,它解析SQL查询,将其转换为对象表示,将其存储在依赖注入容器中,并以字符串形式返回。它是一个 Mouf插件

它主要基于 mouf/magic-query。实际上,magic-query的代码是从query-writer中提取出来的。

好吧,但为什么我会使用QueryWritter呢?

因为它是最有效的方法来处理具有可变数量参数的查询!想想一个典型的datagrid,其中包含许多过滤器(例如按名称、公司、价格等过滤的产品列表)。如果你有使用没有PHP库生成SQL查询的非常常见想法,你的代码将看起来像这样

你不应该这样做!
// People usually write queries like this:
$sql = "SELECT * FROM products p JOIN companies c ON p.company_id = c.id WHERE 1=1 ";
// They keep testing for parameters, and concatenating strings....
if (isset($params['name'])) {
	$sql .= "AND p.name LIKE '".addslashes($params['name'])."%'";
}
if (isset($params['company'])) {
	$sql .= "AND c.name LIKE '".addslashes($params['company'])."%'";
}
// And so on... for each parameter, we have a "if" statement

连接SQL查询是危险的(特别是如果你忘记了保护参数)。你始终可以使用参数化SQL查询,但你仍然需要连接过滤器。

为了避免连接字符串,框架和库已经使用了不同的策略。构建一个完整的ORM(如Doctrine或Propel)是一个好主意,但它使得编写复杂的查询变得更加复杂。其他框架(如Zend)正在使用函数调用构建查询。这些是有效的策略,但你不再直接输入SQL查询,坦白说,直接使用查询总是有用的。

这就是QueryWritter发挥作用的地方。

它是如何工作的?

// TODO: schema... 或者更好的是... 视频!

###1- 编写你的查询 你首先编写你的查询, 纯SQL。没有ORM,没有特殊的查询语言(有人知道DQL或HQL吗?),只是简单的SQL。这很酷,因为每个人都知道SQL。在你的查询中,你可以放入你想象中的所有参数。

###2- 在Mouf中存储你的查询 在Mouf UI中,转到 DB > SQL查询 > 创建SQL查询。在这里,你可以 复制并粘贴你的查询。由于这是Mouf,每个查询都是一个“实例”,你必须为你的查询选择一个名称。

幕后,QueryWritter将解析你的查询并确保查询的每个部分(每个表、每个列、每个过滤器等)都转换为对象。但你现在不必担心这一点。

###3- 测试你的查询 直接从Mouf UI中,你可以测试你的查询!而且,看!因为查询已被解析, QueryWritter将根据你决定使用的参数动态添加查询的部分

###4- 在你的代码中使用它 如果你不是Mouf用户(如果你使用Drupal、Symfony、Zend Framework...),你可以直接通过从Mouf获取实例并调用toSql方法来使用查询,传递参数...

$mySelect = Mouf::getMySelectStatement();
$sql = $mySelect->toSql(array("status"=>1, "search"=>"hello"));

如果你是Mouf用户,你甚至可以直接使用QueryResult类直接运行查询。或者更好的是,使用Evolugrid模块,直接在HTML datagrid中显示你的查询结果!