ThinkPHP 数据库函数:存储函数、数据集、分布式数据库
存储函数
支持存储过程。如果我们在数据库中定义一个存储过程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 类包含以下主要方法:
如果只有单个数据查询需要返回数据集对象,可以使用
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前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。