mouf / database.querywriter
此软件包包含用于生成SQL语句(如SELECT查询等)的类...
Requires
- php: >=5.3.0
- mouf/database.doctrine-dbal-wrapper: ~1.1
- mouf/html.widgets.evolugrid: ~4.0 | ~5.0 | ~6.0
- mouf/magic-query: ~1.0
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中显示你的查询结果!