php

ThinkPHP6.0 入门3,连接配置数据、模型定义

2023-04-10

一、连接配置数据

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';

}