Code前端首页关于Code前端联系我们

ThinkPHP 数据库函数:存储函数、数据集、分布式数据库

terry 2年前 (2023-09-25) 阅读数 64 #后端开发

存储函数

支持存储过程。如果我们在数据库中定义一个存储过程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]);

数据集

数据库查询结果也是数据集。在默认配置中,数据集类型是二维数组。我们可以将其配置为数据集。类,可以支持对数据集进行更多面向对象的操作。您需要使用数据集类函数。您可以指定数据库的resultet_type参数,如下所示:

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

返回的数据集对象为think\Collection,它提供与表相同的访问权限。并且还包括一些额外的方法。可以直接使用数组方法来控制dataset对象,例如:

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

注意,如果要评估dataset是否为空,不能直接使用empty来评估,而必须使用Dataset的isEmpty方法对象来评估,例如:

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

Collection 类包含以下主要方法:

ThinkPHP 数据库操作: 存储过程、数据集、分布式数据库

如果只有单个数据查询需要返回数据集对象,可以使用

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

分布式数据库

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

将其设置为 1 以使用分布式数据库支持。如果使用分布式数据库,数据库配置信息指定如下:

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

附加数据库的数量取决于主机名定义的数量,因此即使是两个相同的IP地址也必须重复指定,但如果存在其他参数。相同的定义无需重复,例如:

是等价的。

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

对应于

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

还可以指定分布式数据库的读写是否分离。默认情况下,读和写是不分离的,即每个服务器都可以进行读和写操作。对于主从数据库,必须设置读写差异。可以通过以下设置来实现:

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

您还可以设置slave_no来配置服务器进行读取操作。

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

如果调用模型的CURD操作,系统会自动判断当前执行的方法是读操作还是写操作。如果使用原生SQL,要注意系统默认规则:写操作必须使用模型执行方式,读操作必须使用模型查询方式,否则主从读写方式会混乱发生。

注意:框架中没有实现主从数据库数据同步工作,数据库必须考虑自己的同步或复制机制。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门