PHPackages                             orz/dbh - 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. orz/dbh

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

orz/dbh
=======

DatabaseHandle

v0.1.1(3y ago)08MITPHPCI passing

Since May 18Pushed 5mo ago1 watchersCompare

[ Source](https://github.com/huanguan1978/dbh)[ Packagist](https://packagist.org/packages/orz/dbh)[ RSS](/packages/orz-dbh/feed)WikiDiscussions main Synced 3w ago

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

DataBaseHandle 跨框架的数据库句柄
========================

[](#databasehandle-跨框架的数据库句柄)

简述
--

[](#简述)

当你不得不在多个PHP框架下为同一个项目编程时，你会发现80%的时间精力都在不同的PHP框架下写数据处理逻辑，在同一个需求开发涉汲多框架多端开发时，如：用laravel作API对接ios、android；用thinkphp作PC版前端和后台开发或作API对接miniprogram；你会发现你的CRUD编码时间会成倍增长且编码后的调试时间也会成倍增长。 提升代码复用率就是最好的解决之道，来吧，把数据处理从框架分离出来，用扩展库的方法引入项目。

Dbh类为常用PHP框架Thinkphp(5.0,5.1,6)，Laravel(6TLS)，Codeigniter(4)，已封装好ServiceProvider，即可在框架中集成也可脱离框架使用。

### 用dbh来处理数据

[](#用dbh来处理数据)

- dbh实例集成了简洁高效的数据类Medoo ```
        // 从框架容器中取出dbh单例
        $dbi = service('dbh');
        // 从dbi实例中取出只读实例
        $ro = $dbi->$dbh('ro');
        // 从dbi实例中取出读写实例，默认参rw为读写实例
        $rw = $dbi->$dbh();
    ```
- dbh实例增删改查操作示例 ```
        // CRUD，获取单条记录
        $row = $ro->get('_plog', '*', ['id'=>1,] );
        echo $ro->last(); // SELECT * FROM `_plog` WHERE `id` = 1 LIMIT 1

        // CRUD，获取多条记录
        $rows = $ro->select('_plog', '*', ['severity'=>'INFO',] );
        echo $ro->last(); // SELECT * FROM `_plog` WHERE `severity` = 'INFO'
        $rows = $ro->select('_plog', ['id','time','severity','message'], ['severity'=>'INFO',] );
        echo $ro->last(); // SELECT  `id`,`time`,`severity`,`message` FROM `_plog` WHERE `severity` = 'INFO'

        // CRUD，添加记录，若需用SQL原生函数可用raw函数处理
        $dat = ['time'=>$rw->raw('NOW()'), 'severity'=>'INFO', 'message'=>'info1', ];
        $pdostmt = $rw->insert('_plog', $dat);
        echo $rw->last(); // INSERT INTO `_plog` (`time`, `severity`, `message`) VALUES (NOW(), 'INFO', 'info1')
        // CRUD，获最记录的自增ID
        $id = $rw->id();

        // CRUD，更新记录，若需用SQL原生函数可用raw函数处理
        $dat = ['time'=>$rw->raw('NOW()'), 'severity'=>'INFO', 'message'=>'info111', ];
        $pdostmt = $rw->update('_plog', $dat, ['id'=>1]);
        echo $rw->last(); // UPDATE `_plog` SET `time` = NOW(), `message` = 'info111' WHERE `id` = '1'

        // CRUD，删除记录
        $pdostmt = $rw->delete('_plog', ['id'=>1]);
        echo $rw->last(); // DELETE FROM `_plog` WHERE `id` = '1'

        // 怎样知道是否错，判断实例属性error是否有值, 实例属性errorInfo得到出错细节
        if($rw->error){
            print_r($rw->errorInfo);
        }

        // 多表联查，数据排序，数据分页，批量操作，事务处理，等进阶用法更多细节请查阅Medoo官方文档
        // 脱离框架使用dbh请参考 demo/Dbt2.php
    ```

### 用dbh来记录日志

[](#用dbh来记录日志)

- dbh实例集成了简洁高效且兼容PR-3的日志类Plog，默认日志表为\_plog ```
        // 从框架容器中取出dbh单例
        $dbi = service('dbh');
        // 从dbi实例中取出Plog实例，默认参db为数据库表记录日志
        $log = $dbi->$wlog('db');
    ```
- dbh实例增删除改查操作示例 ```
        // 6个日志级别，info, notice, debug, warning, error, fatal，均支持快捷操作，必填参数1为文本日志信息，可选参数2为附带数据
        $plog->info('HelloWorld');
        $plog->info('HelloWorld', ['data'=>[123,]]);
        $plog->debug("I'mHere",['data'=>['123','456',"I'm"]]);
    ```
- plog实例输出日志如下 ```
    SELECT * FROM _plog;
    ```

    **id****time****path****line****severity****message****context**12022-04-16 16:29:30test2.localhost.localdomain/xz/plog/demo.php25INFOHelloWorld22022-04-16 16:29:30test2.localhost.localdomain/xz/plog/demo.php26INFOHelloWorld{"data":\[123\]}32022-04-16 16:29:30test2.localhost.localdomain/xz/plog/demo.php26DEBUGImHere{"data":\["123","456","I\\u0027m"\]}

### 框架引入Dbh功能

[](#框架引入dbh功能)

```
常用PHP框架Thinkphp(5.0,5.1,6)，Laravel(6TLS)，Codeigniter(4)，Dbh已封装好ServiceProvider，Facade, Middleware, Event框架中引入即可。

```

#### 引入Dbh服务提供者

[](#引入dbh服务提供者)

- CodeIgniter 4, Config\\Autoload.php

    ```
    public $psr4 = [
        APP_NAMESPACE => APPPATH, // For custom app namespace
        'Config'      => APPPATH . 'Config',
        'Dbh\\CodeIgniter' => ROOTPATH.'vendor\\orz\\dbh\\src\\CodeIgniter\\',
    ];
    ```
- Laravel 6，config/app.php

    ```
    'providers' => [
        //My Dbh Service Providers...
        Dbh\Laravel\Providers\DbhServiceProvider::class,
    ],
    'aliases' => [
        // My Dbh Facade...
        'Dbf' => Dbh\Facades\DbhFacade::class,
    ]
    ```
- Thinkphp 6，app/service.php

    ```
