数据库配置

Viswoole 的数据库配置文件位于 config/database.php,采用通道(Channel)机制管理多个数据库连接。

配置文件结构

php
<?php
// config/database.php

use Viswoole\Database\Channel\PDO\PDOChannel;
use Viswoole\Database\Facade\Db;

return [
    'default' => env('DATABASE_DEFAULT', 'default'),
    'debug' => env('app_debug', true),
    'info_save_manner' => Db::DEBUG_SAVE_CONSOLE | Db::DEBUG_SAVE_LOGGER,
    'channels' => [
        'default' => [
            'driver' => PDOChannel::class,
            'options' => [
                'host' => env('DATABASE_HOST', '127.0.0.1'),
                'port' => (int)env('DATABASE_PORT', 3306),
                'database' => env('DATABASE_NAME', ''),
                'username' => env('DATABASE_USER', 'root'),
                'password' => env('DATABASE_PASSWORD', ''),
                'charset' => 'utf8mb4',
                'collation' => 'utf8mb4_unicode_ci',
            ]
        ]
    ]
];

配置项说明

顶层配置

配置项类型默认值说明
defaultstringdefault默认使用的数据库通道名称
debugbooltrue是否开启调试模式,控制 SQL 日志输出
info_save_mannerint混合输出调试信息的保存方式,支持位运算组合

调试信息保存方式

info_save_manner 支持以下常量,可通过位运算(|)组合使用:

常量说明
Db::DEBUG_SAVE_CONSOLE控制台输出将 SQL 日志输出到终端控制台
Db::DEBUG_SAVE_LOGGER日志记录将 SQL 日志写入日志文件
php
// 仅控制台输出
'info_save_manner' => Db::DEBUG_SAVE_CONSOLE,

// 仅写入日志
'info_save_manner' => Db::DEBUG_SAVE_LOGGER,

// 同时输出到控制台和日志(推荐开发环境使用)
'info_save_manner' => Db::DEBUG_SAVE_CONSOLE | Db::DEBUG_SAVE_LOGGER,

通道配置 (channels)

每个通道是一个独立的数据库连接配置,包含驱动和连接选项。

通道结构

配置项类型说明
driverstring驱动类名,如 PDOChannel::class
optionsarray数据库连接参数

PDO 连接选项

参数类型默认值说明
hoststring127.0.0.1数据库主机地址
portint3306数据库端口
databasestring(必填)数据库名称
usernamestringroot连接用户名
passwordstring``连接密码
charsetstringutf8mb4字符集
collationstringutf8mb4_unicode_ci排序规则

环境变量

建议将敏感信息通过 .env 文件配置:

yaml
# .env
DATABASE_DEFAULT=default
DATABASE_HOST=127.0.0.1
DATABASE_PORT=3306
DATABASE_NAME=my_app
DATABASE_USER=root
DATABASE_PASSWORD=your_password
app_debug=true

多通道配置

Viswoole 支持配置多个数据库通道,适用于读写分离、多数据库等场景。

php
return [
    'default' => env('DATABASE_DEFAULT', 'write'),

    'channels' => [
        // 主库 - 写操作
        'write' => [
            'driver' => PDOChannel::class,
            'options' => [
                'host' => env('DB_WRITE_HOST', '192.168.1.10'),
                'port' => (int)env('DB_WRITE_PORT', 3306),
                'database' => env('DATABASE_NAME', 'app'),
                'username' => env('DB_WRITE_USER', 'writer'),
                'password' => env('DB_WRITE_PASSWORD', ''),
                'charset' => 'utf8mb4',
                'collation' => 'utf8mb4_unicode_ci',
            ]
        ],

        // 从库 - 读操作
        'read' => [
            'driver' => PDOChannel::class,
            'options' => [
                'host' => env('DB_READ_HOST', '192.168.1.20'),
                'port' => (int)env('DB_READ_PORT', 3306),
                'database' => env('DATABASE_NAME', 'app'),
                'username' => env('DB_READ_USER', 'reader'),
                'password' => env('DB_READ_PASSWORD', ''),
                'charset' => 'utf8mb4',
                'collation' => 'utf8mb4_unicode_ci',
            ]
        ],
    ]
];

切换通道

在代码中通过 Db::channel() 方法切换数据库通道:

php
use Viswoole\Database\Facade\Db;

// 使用默认通道查询
$users = Db::table('users')->select();

// 切换到 read 通道执行读操作
$users = Db::channel('read')
    ->table('users')
    ->where('status', 1)
    ->select();

// 切换到 write 通道执行写操作
Db::channel('write')
    ->table('users')
    ->insert(['name' => '新用户']);

在模型中指定通道

ORM 模型可以通过 $channelName 属性指定使用的数据库通道:

php
namespace App\Model;

use Viswoole\Database\Model;

class UsersModel extends Model
{
    protected string $table = 'users';
    protected string $pk = 'id';

    // 指定使用 read 通道
    protected ?string $channelName = 'read';
}