efoft/query-builder

此包的最新版本(1.0.2)没有可用的许可证信息。

辅助类,允许生成数据库的原生语法查询

1.0.2 2018-02-13 14:19 UTC

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()'