快速开始

    hyperf/database 组件是基于 衍生出来的组件,我们对它进行了一些改造,从设计上是允许用于其它 PHP-FPM 框架或基于 Swoole 的框架中的,而在 Hyperf 里就需要提一下 hyperf/db-connection 组件,它基于 实现了数据库连接池并对模型进行了新的抽象,以它作为桥梁,Hyperf 才能把数据库组件及事件组件接入进来。

    其它框架

    默认配置如下,数据库支持多库配置,默认为 default

    1. <?php
    2. return [
    3. 'default' => [
    4. 'driver' => env('DB_DRIVER', 'mysql'),
    5. 'host' => env('DB_HOST', 'localhost'),
    6. 'database' => env('DB_DATABASE', 'hyperf'),
    7. 'username' => env('DB_USERNAME', 'root'),
    8. 'password' => env('DB_PASSWORD', ''),
    9. 'charset' => env('DB_CHARSET', 'utf8'),
    10. 'collation' => env('DB_COLLATION', 'utf8_unicode_ci'),
    11. 'prefix' => env('DB_PREFIX', ''),
    12. 'pool' => [
    13. 'min_connections' => 1,
    14. 'connect_timeout' => 10.0,
    15. 'wait_timeout' => 3.0,
    16. 'heartbeat' => -1,
    17. 'max_idle_time' => (float)env('DB_MAX_IDLE_TIME', 60),
    18. ]
    19. ],
    20. ];

    有时候用户需要修改 PDO 默认配置,比如所有字段需要返回为 string。这时候就需要修改 PDO 配置项 ATTR_STRINGIFY_FETCHES 为 true。

    有时候你希望 SELECT 语句使用一个数据库连接,而 INSERTUPDATE,和 DELETE 语句使用另一个数据库连接。在 Hyperf 中,无论你是使用原生查询,查询构造器,或者是模型,都能轻松的实现

    1. <?php
    2. return [
    3. 'default' => [
    4. 'driver' => env('DB_DRIVER', 'mysql'),
    5. 'read' => [
    6. ],
    7. 'write' => [
    8. 'host' => ['196.168.1.2'],
    9. ],
    10. 'sticky' => true,
    11. 'database' => env('DB_DATABASE', 'hyperf'),
    12. 'username' => env('DB_USERNAME', 'root'),
    13. 'password' => env('DB_PASSWORD', ''),
    14. 'charset' => env('DB_CHARSET', 'utf8'),
    15. 'collation' => env('DB_COLLATION', 'utf8_unicode_ci'),
    16. 'prefix' => env('DB_PREFIX', ''),
    17. 'pool' => [
    18. 'min_connections' => 1,
    19. 'connect_timeout' => 10.0,
    20. 'wait_timeout' => 3.0,
    21. 'heartbeat' => -1,
    22. 'max_idle_time' => (float) env('DB_MAX_IDLE_TIME', 60),
    23. ],
    24. ],
    25. ];

    注意在以上的例子中,配置数组中增加了三个键,分别是 readwritestickyreadwrite 的键都包含一个键为 host 的数组。而 readwrite 的其他数据库都在键为 mysql 的数组中。

    如果你想重写主数组中的配置,只需要修改 readwrite 数组即可。所以,这个例子中: 192.168.1.1 将作为 「读」 连接主机,而 192.168.1.2 将作为 「写」 连接主机。这两个连接会共享 mysql 数组的各项配置,如数据库的凭据(用户名 / 密码),前缀,字符编码等。

    sticky 是一个 可选值,它可用于立即读取在当前请求周期内已写入数据库的记录。若 sticky 选项被启用,并且当前请求周期内执行过 「写」 操作,那么任何 「读」 操作都将使用 「写」 连接。这样可确保同一个请求周期内写入的数据可以被立即读取到,从而避免主从延迟导致数据不一致的问题。不过是否启用它,取决于应用程序的需求。

    配置好数据库后,便可以使用 Hyperf\DbConnection\Db 进行查询。

    Select 查询

    1. <?php
    2. use Hyperf\DbConnection\Db;
    3. $users = Db::select('SELECT * FROM `user` WHERE gender = ?',[1]);
    4. foreach($users as $user){
    5. echo $user->name;
    6. }

    可以使用 Dbinsert 方法来执行 insert 语句。与 select 一样,该方法将原生 SQL 查询作为其第一个参数,并将绑定数据作为第二个参数:

    运行更新语句

    update 方法用于更新数据库中现有的记录。该方法返回受该语句影响的行数:

    1. <?php
    2. use Hyperf\DbConnection\Db;
    3. $affected = Db::update('update user set name = ? where id = ?', ['John', 1]);

    你可以使用 Dbtransaction 方法在数据库事务中运行一组操作。如果事务的闭包 Closure 中出现一个异常,事务将会回滚。如果事务闭包 Closure 执行成功,事务将自动提交。一旦你使用了 transaction , 就不再需要担心手动回滚或提交的问题:

    1. <?php
    2. use Hyperf\DbConnection\Db;
    3. Db::transaction(function () {
    4. Db::table('user')->update(['votes' => 1]);
    5. Db::table('posts')->delete();

    手动使用事务

    如果你想要手动开始一个事务,并且对回滚和提交能够完全控制,那么你可以使用 DbbeginTransaction, commit, :