首頁 >php框架 >ThinkPHP >ThinkPHP資料庫操作之預存程序、資料集、分散式資料庫

ThinkPHP資料庫操作之預存程序、資料集、分散式資料庫

藏色散人
藏色散人轉載
2021-01-28 17:15:232312瀏覽

以下由thinkphp教學欄位來介紹ThinkPHP資料庫作業給大家看預存程序、資料集、分散式資料庫,希望對需要的朋友有幫助!

ThinkPHP資料庫操作之預存程序、資料集、分散式資料庫

儲存程序

#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 類別包含了下列主要方法:

如果只是個別資料的查詢需要傳回資料集對象,則可以使用

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方法,否則會發生主從讀寫錯亂的情況。

  注意:主從資料庫的資料同步工作不在框架實現,需要資料庫考慮自身的同步或複製機制。

以上是ThinkPHP資料庫操作之預存程序、資料集、分散式資料庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除