2011-12-16 134 views
0

我對CodeIgniter相當陌生,正試圖弄清楚我認爲應該很容易的事情。codeigniter實例化的數據庫對象的類型是什麼?

我的應用程序做了一些Product對象,在momenet中我只是通過包含在CodeIgniter的Database類中的ActiveRecord特性來做的。我通常比ORM優先於ActiveRecord,以便將業務邏輯與數據庫邏輯正確分離。但在這種情況下,使用產品的對象通常會自行處理所有業務邏輯,所以我認爲分離仍然有效。

我的產品對象通過store()方法與數據庫交互,我希望接受數據庫連接作爲參數。 store()方法首先查詢數據庫,以確定相關產品是否已經以某種形式存在。如果是這樣,產品將更新爲新的信息,如果不是,則插入產品。簡單的東西。問題是,我想爲store()方法參數使用類型提示,這樣我就可以確保沒有不具有基本CodeIgniter數據庫/ ActiveRecord函數的對象被傳遞給方法,而不會引發相應的錯誤。

對於我的生活,我無法弄清楚CodeIgniter數據庫類的類型。在仔細閱讀源代碼之後,我想了一會兒CI_DB_driver類就是這個類。但是,當我將此用作類型提示時,我的IDE(準確地說是NetBeans 7.01)無法識別或給我任何代碼完成選項,例如insert()get_where()等ActiveRecord函數。我不認爲我的IDE在這方面存在錯誤,因爲它確實承認了諸如query()insertString()的方法。

我可以使用標準的CodeIgniter訪問/連接數據庫的方式,即使用內部的CodeIgniter對象的load方法來實例化一個數據庫對象,但我希望插入或更新產品作爲一個有點混蛋的單位的一部分工作模式。我不需要使用事務,因爲Product對象不依賴於成功的插入或更新任何其他Product對象(也不使用Product對象)。但是,我不想爲要插入或更新的每個Product對象創建一個全新的連接,也不希望將其與持久數據庫連接關聯起來。我寧願做更類似於以下的事情:

// catalog class is just an example 
class Catalog extends CI_Model 
{ 
    public function updateCatalog(array &$products, $dbconn = null) { 
     if ($dbconn === null) { 
      try { 
       $dbconn = $this->load->database('default', true); 
      } catch (SQLException $e) { 
       show_error($e->getMessage); 
      } 
      $close_db = true; 
     } 
     foreach ($products as $product) { 
      try {    
       // use the same db connection for all product storage tasks 
       $product->store($dbconn); 
      } catch (SQLException $e) { 
       show_error($e->getMessage); 
      } 
     } 
     if ($close_db) { 
      $dbconn->close(); // free up database connection for other tasks 
     } 
    } 
... 

這是一個非常基本的例子。如果需要調用上述方法的另一個方法,它將實例化數據庫連接對象本身,並將其傳入。理想情況下,我針對每個總體請求尋找一個數據庫連接。

有沒有人深入瞭解CodeIgniter源代碼,知道我應該用什麼作爲數據庫對象的類型提示?我正在做一個不好的方法來使用CodeIgniter嗎?用一種實現連接池的方式覆蓋CodeIgniter功能會更好嗎?

回答

1

類型由$this->load->database()返回的數據庫對象的其實CI_DB_driver,這就是我希望會是。實際上,類型是CI_DB_(插入數據庫類型)_driver,但是它繼承自CI_DB_driver。

我不知道這是否對任何人都有幫助,但我爲了以防萬一。

0

不知道您輸入提示的含義,但看起來您不想使用CodeIgniter數據庫類。那麼爲什麼你不包含你喜歡的外部ORM類而不是搞亂CodeIgniter呢?

檢查以下資源:

+0

類型提示是代替存儲方法定義存儲($ dbconn)的地方,它將是(例如)存儲(CI_DB $ dbconn)。這使我可以確保只有擴展某個類或實現某個接口的對象才能被傳入該方法。 ORM對於這個問題有點矯枉過正,因爲我提到的Product對象幾乎是唯一需要任何類型自定義功能的對象。如果應用程序擴展到我需要的地方,我會考慮使用ORM。 – xobicvap 2011-12-16 08:14:23