ThinkPHP数据库操作之存储过程、数据集、分布式数据库的示例分析
创始人
2024-12-29 15:23:26
0次

存储过程

5.0支持存储过程,如果我们定义了一个数据库存储过程 sp_query ,可以使用下面的方式调用:

$result = Db::query('call sp_query(8)');

返回的是一个二维数组,也可以使用参数绑定,例如:

$result = Db::query('call sp_query(?)',[8]);
// 或者命名绑定$result = Db::query('call sp_query(:id)',['id'=>8]);

数据集

数据库的查询结果也就是数据集,默认的配置下,数据集的类型是一个二维数组,我们可以配置成数据集类,就可以支持对数据集更多的对象化操作,需要使用数据集类功能,可以配置数据库的resultset_type 参数如下:

return [    // 数据库类型
    'type' => 'mysql',    // 数据库连接DSN配置
    'dsn' => '',    // 服务器地址
    'hostname' => '127.0.0.1',    // 数据库名
    'database' => 'thinkphp',    // 数据库用户名
    'username' => 'root',    // 数据库密码
    'password' => '',    // 数据库连接端口
    'hostport' => '',    // 数据库连接参数
    'params' => [],    // 数据库编码默认采用utf8
    'charset' => 'utf8',    // 数据库表前缀
    'prefix' => 'think_',    // 数据集返回类型
    'resultset_type' => 'collection',];

返回的数据集对象是 think\Collection ,提供了和数组无差别用法,并且另外封装了一些额外的方法。可以直接使用数组的方式操作数据集对象,例如:

// 获取数据集
$users = Db::name('user')->select();
// 直接操作第一个元素
$item = $users[0];
// 获取数据集记录数
$count = count($users);
// 遍历数据集
foreach($users as $user){    echo $user['name'];    echo $user['id'];
}

需要注意的是,如果要判断数据集是否为空,不能直接使用 empty 判断,而必须使用数据集对象的isEmpty 方法判断,例如:

$users = Db::name('user')->select();if($users->isEmpty()){    echo '数据集为空';
}

Collection 类包含了下列主要方法:

ThinkPHP数据库操作之存储过程、数据集、分布式数据库的示例分析

如果只是个别数据的查询需要返回数据集对象,则可以使用

Db::name('user')    ->fetchClass('\think\Collection')    ->select();

分布式数据库

ThinkPHP内置了分布式数据库的支持,包括主从式数据库的读写分离,但是分布式数据库必须是相同的数据库类型。

配置 database.deploy 为1 可以采用分布式数据库支持。如果采用分布式数据库,定义数据库配置信息的方式如下:

//分布式数据库配置定义
return [    
// 启用分布式数据库
    'deploy' => 1,    // 数据库类型
    'type' => 'mysql',    // 服务器地址
    'hostname' => '192.168.1.1,192.168.1.2',    // 数据库名
    'database' => 'demo',    // 数据库用户名
    'username' => 'root',    // 数据库密码
    'password' => '',    // 数据库连接端口
    'hostport' => '',]

连接的数据库个数取决于 hostname 定义的数量,所以即使是两个相同的IP也需要重复定义,但是其他的参数如果存在相同的可以不用重复定义,例如:

'hostport'=>'3306,3306'

和

'hostport'=>'3306'

等效。

'username'=>'user1',
'password'=>'pwd1',

和

'username'=>'user1,user1',
'password'=>'pwd1,pwd1',

等效。

还可以设置分布式数据库的读写是否分离,默认的情况下读写不分离,也就是每台服务器都可以进行读写操作,对于主从式数据库而言,需要设置读写分离,通过下面的设置就可以:

'rw_separate' => true,

在读写分离的情况下,默认第一个数据库配置是主服务器的配置信息,负责写入数据,如果设置了 master_num参数,则可以支持多个主服务器写入。其它的都是从数据库的配置信息,负责读取数据,数量不限制。每次连接从服务器并且进行读取操作的时候,系统会随机进行在从服务器中选择。

还可以设置 slave_no 指定某个服务器进行读操作。

  如果从数据库连接错误,会自动切换到主数据库连接。

调用模型的CURD操作的话,系统会自动判断当前执行的方法的读操作还是写操作,如果你用的是原生SQL,那么需要注意系统的默认规则: 写操作必须用模型的execute方法,读操作必须用模型的query方法,否则会发生主从读写错乱的情况。

  注意:主从数据库的数据同步工作不在框架实现,需要数据库考虑自身的同步或者复制机制。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...