以下由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中文網其他相關文章!