一、连接配置数据
1、ThinkPHP 采用内置抽象层将不同的数据库操作进行封装处理,数据抽象层基于 PDO 模式,无须针对不同的数据库编写相应的代码
2、连接配置你的数据库
3、在根目录的 config 下的 database.php 可以设置数据库连接信息
<?php
return [
// 默认使用的数据库连接配置
'default' => env('database.driver', 'mysql'),
// 自定义时间查询规则
'time_query_rule' => [],
// 自动写入时间戳字段
// true为自动识别类型 false关闭
// 字符串则明确指定时间字段类型 支持 int timestamp datetime date
'auto_timestamp' => true,
// 时间字段取出后的默认时间格式
'datetime_format' => 'Y-m-d H:i:s',
// 时间字段配置 配置格式:create_time,update_time
'datetime_field' => '',
// 数据库连接配置信息
'connections' => [
'mysql' => [
// 数据库类型
'type' => env('database.type', 'mysql'),
// 服务器地址
'hostname' => env('database.hostname', '127.0.0.1'),
// 数据库名
'database' => env('database.database', 'tp60-learning'),
// 用户名
'username' => env('database.username', 'root'),
// 密码
'password' => env('database.password', 'root'),
// 端口
'hostport' => env('database.hostport', '3306'),
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => env('database.charset', 'utf8'),
// 数据库表前缀
'prefix' => env('database.prefix', 'tp_'),
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => true,
// 是否需要断线重连
'break_reconnect' => false,
// 监听SQL
'trigger_sql' => env('app_debug', true),
// 开启字段缓存
'fields_cache' => false,
],
// 更多的数据库配置信息
],
];
4、由于database.php配置文件生效在部署环境,但我们是处于开发环境,本地开发,会优先采用.env 的配置信息,我们和 database 配置对应上即可,我数据库使用了表前缀。所以我在本地环境添加了:
prefix = tp_
APP_DEBUG = true
[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1
DATABASE = tp60-learning
USERNAME = root
PASSWORD = root
HOSTPORT = 3306
CHARSET = utf8
prefix = tp_
DEBUG = true
[LANG]
default_lang = zh-cn
5、创建一个用于测试数据连接的控制器: DatabaseTest.php
<?php
namespace app\controller;
use think\facade\Db;
class DatabaseTset
{
public function index(){
$user = Db::table('tp_user')->select();
return json($user);
}
}
6、访问http://tp.com/DatabaseTset可以看到tp_user表中所有信息都返回了,
7、那么如何验证现在读取的是哪一个配置文件呢,只需改变.env配置文件或删除.env配置文件信息,即可验证 database 的执行优先级,若想让系统读取database.php配置文件。只需清空.env文件中的所有配置信息即可
8、在 database.php 配置中, default 表示设置默认的数据库连接, .env优先于database.php
9、切换数据库连接:connections 配置数据库连接信息,可以是多个数据库,默认的数据库连接名称为:'mysql',再复制一组数据库链接信息:'mysq2'切换数据库 :换一下数据库名
<?php
return [
// 默认使用的数据库连接配置
'default' => env('database.driver', 'mysql'),
// 自定义时间查询规则
'time_query_rule' => [],
// 自动写入时间戳字段
// true为自动识别类型 false关闭
// 字符串则明确指定时间字段类型 支持 int timestamp datetime date
'auto_timestamp' => true,
// 时间字段取出后的默认时间格式
'datetime_format' => 'Y-m-d H:i:s',
// 时间字段配置 配置格式:create_time,update_time
'datetime_field' => '',
// 数据库连接配置信息
'connections' => [
'mysql' => [
// 数据库类型
'type' => env('database.type', 'mysql'),
// 服务器地址
'hostname' => env('database.hostname', '127.0.0.1'),
// 数据库名
'database' => env('database.database', 'tp60-learning'),
// 用户名
'username' => env('database.username', 'root'),
// 密码
'password' => env('database.password', 'root'),
// 端口
'hostport' => env('database.hostport', '3306'),
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => env('database.charset', 'utf8'),
// 数据库表前缀
'prefix' => env('database.prefix', 'tp_'),
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => true,
// 是否需要断线重连
'break_reconnect' => false,
// 监听SQL
'trigger_sql' => env('app_debug', true),
// 开启字段缓存
'fields_cache' => false,
],
'mysql2' => [
// 数据库类型
'type' => env('database.type', 'mysql'),
// 服务器地址
'hostname' => env('database.hostname', '127.0.0.1'),
// 数据库名
'database' => env('database.database2', 'tp60-learning2'),
// 用户名
'username' => env('database.username', 'root'),
// 密码
'password' => env('database.password', 'root'),
// 端口
'hostport' => env('database.hostport', '3306'),
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => env('database.charset', 'utf8'),
// 数据库表前缀
'prefix' => env('database.prefix', 'tp_'),
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => true,
// 是否需要断线重连
'break_reconnect' => false,
// 监听SQL
'trigger_sql' => env('app_debug', true),
// 开启字段缓存
'fields_cache' => false,
],
// 更多的数据库配置信息
],
];
在.env中
APP_DEBUG = true
[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1
DATABASE = tp60-learning
DATABASE2 = tp60-learning2
USERNAME = root
PASSWORD = root
HOSTPORT = 3306
CHARSET = utf8
prefix = tp_
DEBUG = true
[LANG]
default_lang = zh-cn
10、切换数据库的操作也很简单,添加一个site方法
<?php
namespace app\controller;
use think\facade\Db;
class DatabaseTset
{
public function index(){
$user = Db::table('tp_user')->select();
return json($user);
}
public function site(){
$site = Db::connect('mysql2')->table('tp_user')->select();
return json($site);
}
}
二、模型定义
1、在 app 目录下创建一个 model 目录,并创建 User.php 的模型类,User 继承模型基类,即可实现数据调用,
<?php
namespace app\model;
use Think\Model;
class User extends Model
{
}
2、我们回到控制器创建getuser方法
<?php
namespace app\controller;
use app\model\User;
use think\facade\Db;
class DatabaseTset
{
public function index(){
$user = Db::table('tp_user')->select();
return json($user);
}
public function site(){
$site = Db::connect('mysql2')->table('tp_user')->select();
return json($site);
}
public function getUser(){
$user = User::select();
return json($user);
}
}
即可实现数据调用
3、如果你还想通过模型切换数据库,只需在模型创建一个受保护的 protected $connection = 'mysql2';
<?php
namespace app\model;
use Think\Model;
class User extends Model
{
protected $connection = 'mysql2';
}