efoft / query-builder
辅助类,允许生成数据库的原生语法查询
Requires
- php: >=5.3.0
This package is not auto-updated.
Last update: 2024-09-28 19:52:55 UTC
README
=== 该包允许通过在类对象上执行多次可变调用来生成原生SQL查询。SQL查询通过替代表示进行注入保护。此外,还有获取此类替代表示绑定值的方法。
安装
该包旨在通过Composer使用。将其添加到您的composer.json中
"require": {
"efoft/query-builder" : "dev-master"
}
或直接通过命令行运行
composer require efoft/query-builder
初始化
$q = new QueryBuilder\SQLQueryBuilder();
类构造函数有2个可选参数
- $quoting - 引用类型:'none','sql','mysql','mssql', 'sqlite'之一。有关说明,请参阅http://www.sqlite.org/lang_keywords.html。
- $debug - 如果为mysql指定了引用类型并启用了调试模式,则为true或false。
$q = new QueryBuilder\SQLQueryBuilder('mysql', true);
用法
您可以通过链式方式逐个调用创建的$q对象上的方法,以填充生成查询所需的所有参数。重要!如果您重新使用$q进行新查询,请首先调用->newQuery()方法。
以下方法可以多次运行,参数将被聚合。如果某些查询更改是条件性的,则非常有用。
- table / from
- select
- insert
- update
- order
- group
- where
方法table()和from()只是别名。指定多个表仅适用于SELECT查询。对于所有其他查询,仅使用第一个表。上述所有方法(除了where())都可以以几种可能的方式接受参数
- 'item1','item2'...
- 'item1, item2...'
- array('item1','item2'...)
- 以及上述方法的混合。
方法where()通过数组指定WHERE条件。格式类似于MongoDB find()语法,但到目前为止仅限于$or和$and运算符。
以下示例将更详细地说明。
Select
方法 ->select().可以链式调用,可以多次调用。重复项将被自动删除。要指定别名,请使用关联数组:array('field'=>'alias', ...)。以下方法允许设置ORDER BY、GROUP BY、LIMIT和DISTINCT指令
- order()
- group()
- limit()
- distinct()
// select
$q->from('table1, table2 ')->from('table2')->select(array('table2.age'=>'a','table1.name'=>'n'))->where(array('id'=>13));
$q->where(array('age'=>'/3.*/'))->order('name')->limit(100)->distinct();
echo $q->getQuery() . PHP_EOL;
echo print_r($q->getBindings()) . PHP_EOL;
SELECT `table2`.`age` AS a,`table1`.`name` AS n FROM table1,table2 WHERE `id`=:id AND `age` LIKE :age ORDER BY name LIMIT 100;
Array
(
[id] => 13
[age] => 3%
)
Insert
方法 ->insert().可以链式调用,可以多次调用。参数必须是关联数组,如array('field'=>'value'...)。
// insert
$q->newQuery()->insert(array('age'=>34, 'name'=>'John'))->table('table1,table2');
echo $q->getQuery() . PHP_EOL;
echo print_r($q->getBindings()) . PHP_EOL;
INSERT INTO table1(`age`,`name`) VALUES (:age,:name);
Array
(
[age] => 34
[name] => John
)
Update
方法 ->update().可以链式调用,可以多次调用。参数必须是关联数组,如array('field'=>'value'...)。
// update
$q->newQuery()->update(array('age'=>34, 'name'=>'John'))->table('table1')->where(array('$or'=>array('id'=>13, 'phone'=>'/+7916.*/')));
echo $q->getQuery() . PHP_EOL;
echo print_r($q->getBindings()) . PHP_EOL;
UPDATE table1 SET `age`=:age,`name`=:name WHERE `id`=:id OR `phone` LIKE :phone;
Array
(
[age] => 34
[name] => John
[id] => 13
[phone] => +7916%
)
Delete
方法 ->delete().不需要任何参数,但条件必须跟随where()。
// delete
$q->newQuery()->delete()->from('table3')->where(array('id'=>13));
echo $q->getQuery() . PHP_EOL;
echo print_r($q->getBindings()) . PHP_EOL;
DELETE FROM table3 WHERE `id`=:id;
Array
(
[id] => 13
)
Join
方法 ->join()。它有3个必需参数(连接表、主表中的键字段、连接表中的键字段)和1个可选参数 - 连接类型(默认使用LEFT)。对于键字段,不需要指定它们为完全限定名,这会自动完成。连接适用于SELECT、UPDATE和DELETE语句,并且如果连接多个表,可以多次运行。
$q->from('table1')->select(array('table1.age'=>'a','table1.name'=>'n'))->order('n')->limit(100);
$q->join('tags','id','relid')->join('imgs','id','relid')->distinct();
$q->where(array('$or'=>array(array('tags.value'=>'three'),array('imgs.value'=>'image1.png'))));
检索结果
获取结果查询
$sql = $q->getQuery();
获取绑定值
$values = $q->getBindings()'