2013-04-23 24 views
1

我曾搜索解決方案,但沒有發現任何幫助。 This問題是關於在數據映射器中使用多個數據庫,但我已經使用該方法。使用CI DataMapper加入不同數據庫中的表ORM

用戶模型:

class User extends DataMapper { 
    var $prefix = "app_"; 

    var $db_params = 'default'; 
... 

公司模式:

class Company extends DataMapper { 
    var $prefix = "tbl_"; 

    var $db_params = 'super'; 
... 

我有以上車型。他們與用戶擁有一家公司和公司擁有許多用戶相關。 當我創建一家公司時,會自動創建一個用戶,並且這個關係是成功的。

然而,當我嘗試刪除公司,或嘗試存取權限的用戶的相關公司。 DataMapper在錯誤的地方查找用戶表。

我得到了以下錯誤:

A Database Error Occurred 

Error Number: 1146 

Table 'a1210alf.app_users' doesn't exist 

SELECT `tbl_companies`.* FROM (`tbl_companies`) LEFT OUTER JOIN `app_users` app_users ON `tbl_companies`.`id` = `app_users`.`company_id` WHERE `app_users`.`id` = 4 

在我的CI配置我有兩個數據庫「默認」和「超級」兩個不同的設定。我在模型中設置了正確的一個。表app_users確實存在,所有需要的字段都在那裏。不知道我做錯了什麼。

回答

1

我現在正在使用此解決方案。在任何情況下,它仍然沒有「爆發」,所以我想這是做到這一點的正確方法。

首先我創建了一個 'BaseModel',其 '延伸的DataMapper'。構造函數看起來是這樣的:

/** 
* Constructor: calls parent constructor 
*/ 
function __construct($id = NULL, $db = NULL) 
{ 
    if ($db != NULL && $this->db_params == '') {  
     // use these params as default 
     $this->db_params = array_merge(array( 
      'dbdriver' => 'mysql', 
      'pconnect' => true, 
      'db_debug' => true, 
      'cache_on' => false, 
      'char_set' => 'utf8', 
      'cachedir' => '', 
      'dbcollat' => 'utf8_general_ci', 
      'autoinit' => true, 
      'stricton' => false, 
     ), $db); 
    } 
    elseif($this->db_params == '') { 
     $CI =& get_instance(); 
     $cid = $CI->session->userdata('cid'); 
     if($cid != false || $cid != '') { 
      $userDB = new Database(); 
      $userDB->get_where(array('company_id'=>$cid)); 
      if($userDB->exists()) { 
       $this->db_params = array(
        'hostname'  => $userDB->dbhost, 
        'database'  => $userDB->dbname, 
        'username'  => $userDB->dbuser, 
        'password'  => $userDB->dbpass, 
        'dbdriver' => 'mysql', 
        'pconnect' => true, 
        'db_debug' => true, 
        'cache_on' => false, 
        'char_set' => 'utf8', 
        'cachedir' => '', 
        'dbcollat' => 'utf8_general_ci', 
        'autoinit' => true, 
        'stricton' => false, 
       ); 
      } 
     } 
    } 
    parent::__construct($id); 
} 

現在,如果你創建一個用戶的情況下,我們應該做的$u = new User(NULL, $this->udb);其中$this->udb是其在主控制器中加載的連接PARAMS。

這樣的模式將得到正確的PARAMS各一次。如果需要相關的對象,BaseModel知道從哪裏得到正確的參數。

所有我關心的是,它的工作原理:對

注:沒有必要設置var $db_params = 'default';每個模型。如果你這樣做,它會覆蓋你在BaseModel的構造函數中設置的參數。

也許這將是有用的人。但是這是一個特例,我不鼓勵任何人使用CodeIgniter + Datamapper來設計他們的數據庫。

0

我認爲你不能解決不同數據庫上的關係。你必須用你自己的邏輯來模擬這個。

+0

那麼有可能,我會用我現在使用的代碼編輯問題。 – Brainfeeder 2013-12-04 11:59:09

+0

好的謝謝分享你的代碼:) – soupdiver 2013-12-05 08:24:19

+0

沒問題。請注意,應用程序爲使用該應用程序的每個「公司」使用了不同的數據庫。這就是爲什麼當有人登錄時(這是在默認(共享)系統數據庫上運行),我可以在控制器中加載正確的數據庫連接參數。如果沒有「動態」參數,則可以通過在主控制器中返回靜態參數來使用相同的Approuch。 – Brainfeeder 2013-12-05 11:54:25

相關問題