PHPackages                             wazsmwazsm/db - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. wazsmwazsm/db

ActiveLibrary[Database &amp; ORM](/categories/database)

wazsmwazsm/db
=============

A database query builder

v1.1(5y ago)510[1 issues](https://github.com/wazsmwazsm/DB/issues)MITPHPPHP &gt;=5.5CI failing

Since Apr 23Pushed 5y ago1 watchersCompare

[ Source](https://github.com/wazsmwazsm/DB)[ Packagist](https://packagist.org/packages/wazsmwazsm/db)[ Docs](https://github.com/wazsmwazsm/DB)[ RSS](/packages/wazsmwazsm-db/feed)WikiDiscussions master Synced 2mo ago

READMEChangelog (2)Dependencies (2)Versions (3)Used By (0)

DB Query Builder
================

[](#db-query-builder)

[![Build Status](https://camo.githubusercontent.com/aab7f1885e17698c3c8b2c2a57022fc744e620d99adc7ab0d2082cf59a3847fe/68747470733a2f2f7472617669732d63692e6f72672f77617a736d77617a736d2f44422e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/wazsmwazsm/DB)

一个简单好用的查询构造器，基于 PDO，支持 mysql、postgresql、sqlite，支持常驻内存模式的断线重连。

安装
--

[](#安装)

```
composer require wazsmwazsm/db
```

依赖
--

[](#依赖)

- php pdo 扩展
- php pdo\_mysql 扩展（可选）
- php pdo\_pgsql 扩展（可选）
- php pdo\_sqlite 扩展（可选）

如何开始
====

[](#如何开始)

初始化配置
-----

[](#初始化配置)

查询构造器支持多个数据库连接，初始化后每个连接以单例的形式存在。

```
use DB/DB;

// 配置信息
$db_conf = [
	// mysql 配置样例
    'con1' => [
        'driver'      => 'mysql',
        'host'        => 'localhost',
        'port'        => '3306',
        'user'        => 'username',
        'password'    => 'password',
        'dbname'      => 'database',
        'charset'     => 'utf8',
        'prefix'      => '',
        'timezone'    => '+8:00',
        'collection'  => 'utf8_general_ci',
        // 'strict'      => false,
        // 'unix_socket' => '/var/run/mysqld/mysqld.sock',
        // 'options'     => [],
    ],

	// postgresql 配置样例
    'con2' => [
        'driver'           => 'pgsql',
        'host'             => 'localhost',
        'port'             => '5432',
        'user'             => 'username',
        'password'         => 'password',
        'dbname'           => 'database',
        'charset'          => 'utf8',
        'timezone'         => '+8:00',
        'prefix'           => '',
        // 'schema'           => '',
        // 'application_name' => '',
        // 'sslmode'          => 'disable',
        // 'options'          => [],
    ],
	// sqlite 配置样例
    'con3' => [
        'driver'  => 'sqlite',
        'dbname'  => 'database.db',
        'prefix'  => '',
        // 'options' => [],
    ],
    // 其他连接
    'con3' => [
        // ...
    ]
];

// 初始化连接
DB::init($db_conf);
```

获取连接
----

[](#获取连接)

```
use DB\DB;

$con = DB::connection('con1');

$result = $con->table('test_table')->get();
```

模型
--

[](#模型)

这里的模型并不是 ORM 模型，它只是为了方便操作而对查询构造器 \\DB\\DB 的一个封装。

```
use DB\Model;

class MyModel extends Model
{
    // 指定数据库连接
    protected $connection;
	// 指定数据表
    protected $table;
    // 自定义方法
    public function getData()
    {
    	// 使用查询构造器的方法
        return $this->get();
    }
}

$m = new MyModel;

$result = $m->getData();
```

查询数据
====

[](#查询数据)

获取结果
----

[](#获取结果)

获取结果的方法有：get，row，getList，count，sum，avg，max，min。参数等信息参考 [ConnectorInterface](https://github.com/wazsmwazsm/DB/blob/master/src/DB/Drivers/ConnectorInterface.php)。

### 获取结果集

[](#获取结果集)

table 方法用来指定查询的数据表。

get 方法用来获取结果集，返回值是一个查询结果的数组。

```
// SELECT * FROM test;
$data = DB::connection('con1')->table('test')->get();
```

### 获取一行数据

[](#获取一行数据)

select 方法用来指定要取的列，select('\*') 代表取所有列 (此时 select 可以省略不写)。

row 方法用来获取一行数据。

```
// SELECT id, name, age, score FROM test WHERE id = 10;
$row = DB::connection('con1')
    ->table('test')
    ->select('id', 'name', 'age', 'score')
    ->where('id', 10)
    ->row();
```

### 获取一列

[](#获取一列)

有时候我们需要获得某一列的数据，这时 getList 方法就派上用场了，getList 方法直接返回该列值的数组。

```
// 获取 name 字段的结果集
// SELECT name FROM test;
$data = DB::connection('con1')->table('test')->getList('name');
```

### 聚合函数

[](#聚合函数)

查询构造器为获取聚合函数的结果做了封装，你可以使用 count，sum 等方法获取聚合数据。

```
// 获取查询结果的条数
// SELECT COUNT(*) FROM test;
$data = DB::connection('con1')->table('test')->count(*);
// 获取 score 的总和
// SELECT SUM(score) FROM test;
$data = DB::connection('con1')->table('test')->sum('score');
```

> 如果要执行 count(distinct name) 此类的 SQL，请使用 countRaw() 方法

where 子句
--------

[](#where-子句)

构建 where 子句的方法有 where、orWhere。

where 、orWhere 方法的参数支持三种模式：

- where(\['name' =&gt; 'mike', 'age' =&gt; 18\])
- where('age', 24)
- where('score', '&gt;=', 60)、where('tag', 'like', '%php%')

一些常用的例子：

```
// SELECT * FROM test WHERE name = 'mike' AND age = 18;
$data = DB::connection('con1')
    ->table('test')
    ->where([
        'name' => 'mike',
        'age' => 18
    ])
    ->get();

// SELECT * FROM test WHERE name = 'jack' AND age >= 18;
$data = DB::connection('con1')
    ->table('test')
    ->where('name', 'jack')
    ->where('age', '>=',  18)
    ->get();
// SELECT * FROM test WHERE name = 'jack' OR name = 'mike';
$data = DB::connection('con1')
    ->table('test')
    ->where('name', 'jack')
    ->orWhere('name', 'mike')
    ->get();
```

对于 null 的条件查询，查询构造器提供了 whereNull、whereNotNull 等方法：

```
// SELECT * FROM test WHERE name IS NOT null;
$data = DB::connection('con1')
    ->table('test')
    ->whereNotNull('name')
    ->get();
```

> 注：where is null 子句的构造提供 whereNull、orWhereNull、whereNotNull、orWhereNotNull 四个方法。

where between 子句：

```
// SELECT * FROM test WHERE age BETWEEN 18 AND 30;
$data = DB::connection('con1')
    ->table('test')
    ->whereBetween('age', 18, 30)
    ->get();
```

> 注：where between 子句的构造提供 whereBetween、orWhereBetween 个方法。

where in 子句：

```
// SELECT * FROM test WHERE age IN (18, 19, 20);
$data = DB::connection('con1')
    ->table('test')
    ->whereIn('age', [18, 19, 20])
    ->get();
```

> 注：where in 子句的构造提供 whereIn、orWhereIn、whereNotIn、orWhereNotIn 四个方法。

复杂 where 子句
-----------

[](#复杂-where-子句)

where exists 子句：

```
// SELECT * FROM user WHERE EXISTS ( SELECT * FROM user_group WHERE id = 3 ) AND g_id = 3;
$data = DB::connection('con1')
    ->table('user')
    ->whereExists(function($query) {
        $query->table('user_group')->where('id', 3);
    })
    ->where('g_id', 3)
    ->get();
```

> 注：where exists 子句的构造提供 whereExists、orWhereExists、whereNotExists、orWhereNotExists 四个方法。

where in 子查询：

```
// SELECT * FROM user WHERE g_id IN (SELECT id FROM user _group);
$data = DB::connection('con1')
    ->table('user')
    ->whereInSub('g_id', function($query) {
        $query->table('user_group')->select('id');
    })
    ->get();
```

> 注：where in 子查询的构造提供 whereInSub、orWhereInSub、whereNotInSub、orWhereNotInSub 四个方法。

对于复杂的 where 逻辑，我们经常使用圆括号来确定优先级。查询构造器提供了 whereBrackets() 和 orWwhereBrackets() 方法来添加圆括号。

```
// SELECT * FROM user WHERE (id < 50 OR username IS NOT NULL) AND sort_num = 20;
$data = DB::connection('con1')
    ->table('user')
    ->whereBrackets(function($query) {
        $query->where('id', '', 5);
    })
    ->get();
```

子查询
---

[](#子查询)

查询构造器提供了 fromSub 方法进行子查询：

```
// SELECT id, username, email FROM ( SELECT * FROM user WHERE id < 20 ) AS tb;
$data = DB::connection('con1')
    ->select('id', 'username', 'email')
    ->fromSub(function($query) {
        $query->table('user')->where('id', '
