通常情況下,如果乙個應用只是操作同乙個資料庫(或者分布式資料庫)的話,你只需要在專案配置檔案中定義資料庫連線資訊即可。這裡說的多資料庫操作一般指的是在乙個應用中會操作不同的資料庫(包括同型別的和不同型別的資料庫),甚至包括動態切換多資料庫的情況。
對於早期版本的thinkphp來說,切換資料庫需要使用高階模型,而現在的3.1版本則可以更加輕鬆的解決了。
新版對多資料的支援有下面幾種方式,開發人員可以根據實際情況選擇合適的方式操作:
1.模型定義資料庫
如果只是簡單的跨庫操作,並且只是個別模型類的話,你可以直接在模型類中定義dbname屬性即可:
protected $dbname = 'top';
例項化的時候,記得要使用d方法,例如:
$user = d('user');
這種方式定義的前提是當前資料庫使用者賬戶有操作top資料庫的許可權。
2.模型定義資料庫連線
如果你的跨庫操作需要使用不同的資料庫連線賬號或者需要連線不同型別的資料庫,可以直接在模型類裡面定義connection屬性,在操作該模型類的時候,就會自動連線到指定的資料庫。例如:
protected $connection = 'mysql://root:1234@localhost:3306/thinkphp';
或者使用陣列方式定義:
protected $connection = 程式設計客棧array(
程式設計客棧 'db_type' => 'mysql',
'db_user' => 'root',
'db_pwd' => '1234',
'db_host' => 'localhost',
'db_port' => '3306',
'db_name' => 'thinkphp'
);如果我們已經在配置檔案中配置了額外的資料庫連線資訊,例如:
//資料庫配置1
'db_config1' = array(
'db_type' => 'mysql',
'db_user' => 'root',
'db_pwd' => '1234',
'db_host' => 'localhost',
'db_port' => '3306',
'db_name' => 'thinkphp'
),//資料庫配置2
'db_config2' => 'mysql://root:1234@localhost:3306/thinkphp';
那麼,我們可以把模型類的屬性定義改為:
//呼叫配置檔案中的資料庫配置1
protected $connection = 'db_config1';
或者://呼叫配置檔案中的資料庫配置2
protected $connection = 'db_config2';
這種方式的優點可以支援不同資料庫型別,也就是說可以和當前的專案配置檔案中的資料庫型別不同,缺點是必須使用d方法例項化,而且不能動態設定。
3.模型例項化指定連線
新版支援在例項化模型的時候指定資料庫連線,例如:
$user = new model('user','think_','mysql://root:1234@localhost/thinkphp');
或者使用m方法例項化:
$user = m('user','think_','mysql://root:1234@localhost/thinkphp');
m方法的第二個引數是資料表的字首,如果留空表示採用專案配置的資料表字首,第三個引數則是當前例項化需要的資料庫連線資訊。
同樣的道理,在例項化中傳入的資料庫連線資訊也可以採用配置名稱的方式,例如:
$user = m('user','think_','db_config2www.cppcns.com');
如果當前操作不需要切換資料庫連線,只是需要切換資料庫,則可以採用:
$user = m('top.user','think_');
表示例項化top資料庫的think_user資料表。如果你的資料表沒有字首,可以使用
$user = m('top.user',null);
表示例項化top資料庫的user表。
4.動態切換連線
系統還提供了更靈活的動態操作,可以使用模型類提供的db方法進行多資料庫連線和切換操作,用法:
model->db("資料庫編號","資料庫配置");
資料庫編號用數字格式,對於已經呼叫過的資料庫連線,是不需要再傳入資料庫連線資訊的,系統會自動記錄。對於初始化的資料庫連線,內部的資料庫編號是0,因此為了避免衝突,請不要再次定義資料庫編號為0的資料庫配置。
資料庫配置的定義方式和模型定義connection屬性一樣,支援陣列、字串以及呼叫配置引數三種格式。
db方法呼叫後返回當前的模型例項,直接可以繼續進行模型xahwlqotf的其他操作,所以該方法可以在查詢的過程中動態切換,例如:
$this->db(1,"mysql://root:123456@localhost:3306/test")->query("查詢sql");
該方法新增了乙個編號為1的資料庫連線,並自動切換到當前的資料庫連線。
當第二次切換到相同的資料庫的時候,就不需要傳入資料庫連線資訊了,可以直接使用:
$this->db(1)->query("查詢sql");
在沒有再次進行資料庫切換之前,當前的所有操作都是針對db(1)所設定的資料庫。
如果需要切換到預設的資料庫連線,只需要呼叫:
$this->db(0);
如果我們已經在專案配置中定義了其他的資料庫連線資訊,我們就可以直接在db方法中呼叫配置進行連線了:
$this->db(1,"db_config1")->query("查詢sql");
$this->db(2,"db_config2")->query("查詢sql");
如果切換資料庫之後,資料表和當前不一致的話,可以使用table方法指定要操作的資料表:
$this->db(1)->table("top_user")->find();
如果要返回當前的資料庫連線,可以直接呼叫空的db方法即可,例如:
$db = $this->db();
本文標題: thinkphp3.1新特性之多資料庫操作更加完善
本文位址: /wangluo/php/109728.html
ThinkPHP3 1新特性 Action引數繫結
action引數繫結功能提供了url變數和操作方法的引數繫結支援,這一功能可以使得你的操作方法定義和引數獲取更加清晰,也便於跨模組呼叫操作方法了。這一新特性對以往的操作方法使用沒有任何影響,你也可以用新的方式來改造以往的操作方法定義。action引數繫結的原理是把url中的引數 不包括分組 模組和操...
ThinkPHP3 1新特性 內容解析輸出
thinkphp中頁面輸出的過程是讀取模板檔案,然後進行模板解析 也支援呼叫第三方模板引擎解析 但是有一些情況,我們並沒有定義模板檔案,或者把模板檔案儲存在資料庫裡面,那麼這個時候進行頁面輸出的時候,我們是無法進行模板檔案讀取的,3.1版本則針對這樣的情況增加了內容解析輸出的功能。內建的模板引擎也進...
ThinkPHP3 1新特性 多層MVC支援
thinkphp基於mvc model view controller,模型 檢視 控制器 模式,不過均支援多層 multi layer 設計。模型 model 層 預設的模型層由model類構成,但是隨著專案的增大和業務體系的複雜化,單一的模型層很難解決要求,從3.1開始推出了多層model的支援...