上一次我們把模型的驅動類實現了,由於ConnectionManager需要按照設定檔中配置的驅動名執行個體化驅動類,所以我們先在設定檔中加入驅動名:
03 |
'defaultController' => 'Index', |
04 |
'defaultAction' => 'index', |
06 |
'errorReporting' => -1, |
09 |
'dsn' => 'mysql:dbname=test;host=localhost', |
這裡面的db下面的driver就是驅動名。
設定檔弄好之後,ConnectionManager這個類的兩個靜態方法:getConnection和releaseConnection的實現就很簡單了,首先getConnection就是按照設定檔中的配置選擇一個驅動類,然後執行個體化,當然,由於以後模型檔案可能有多個,然後資料庫的串連最好只有一個,所以這個地方必須是單例的,releaseConnection就更簡單了,直接調用驅動類的close方法即可。
02 |
class ConnectionManager extends Base { |
03 |
private static $_instance = null; |
04 |
public static function getConnection() { |
05 |
if(self::$_instance == null) { |
07 |
switch(C('db=>driver')) { |
09 |
self::$_instance = new PdoDriver(); |
12 |
self::$_instance = new PdoDriver(); |
16 |
return self::$_instance; |
18 |
public static function releaseConnection() { |
19 |
if(null !== self::$_instance) { |
20 |
self::$_instance.close(); |
ConnectionManager寫完之後,我們再講ModelBase,由於這個類是後面的表模型和關聯式模式的父類,所以它基本上定義了外部可訪問的所有介面,如execute,select,update,insert,delete等。現在我們先寫一個比較簡單的ModelBase,這個例子中只有建構函式,execute,getAll三個方法,execute就是執行一個SQL,getAll就是擷取資料。
註:如果按照之前我們講的可以按照對象,普通數組或者Iterator返回資料,那麼此處的getAll就比較複雜了,但是現在我們在getAll中就直接調用getAllByAssocArray,這樣這個方法就非常簡單了。
好了,話不多說,直接貼代碼吧!!
02 |
class ModelBase extends Base { |
03 |
protected $_db = null; |
04 |
public function __construct() { |
05 |
$this->_db = ConnectionManager::getConnection(); |
07 |
public function execute($sql,Array $arr) { |
08 |
$this->_db->prepare($sql); |
09 |
$this->_db->execute($arr); |
11 |
public function getAll() { |
12 |
return $this->_db->getAllByAssocArray(); |
由於此處沒有幾行代碼,所以就不講了,下面講一下複雜一點的東西了啊。。。
我之前在B這一塊兒還分了一個Sql Parse,它主要完成SQL的解析,我們知道一個簡單的查詢語句格式如下:
SELECT [ALLDISTINCT] Field FROM Table WHERE whereCondition [GROUP BY groupCondition] [HAVING havingCondition] [ORDER BY orderCondition]
之前我們都是直接寫一個SQL字串,這種方式不利於我們擴充,如果我們只需要指定SQL的一部分內容,其他的內容架構可以自動完成,這樣維護起來容易一些,當然,複雜的SQL我不建議這麼做。
就比如在表模型中,我們是指定了表名的,那麼架構應該可以識別出來Table這一塊兒,還有Field這部分可以預設為*,whereCondition如果沒有可以不寫,All或DISTINCT預設是ALL即可。
現在假設在一個表模型中,關聯的表為user,那麼執行一個$this->select(),按照原來的觀點系統根本不知道查詢的語句是什麼,自然也就無法執行了,但是如果架構可以自動完成SQL的話,這個SQL就變成了:
SELECT * FROM user
這樣一個SQL語句是沒有任何問題的。