2013-09-21 66 views
0

我正在學習PHP中的MVC並使用PDO進行數據庫訪問。PHP MVC PDO多個數據庫

我的數據庫類如下(我用的數據庫變量的配置文件中定義):

class Database extends PDO { 

    public function __construct($dbconn ="mysql") { 

     $options = array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING); 

     switch($dbconn) { 
      case 'usados': 
       parent::__construct(DB_TYPE_USADOS . ':host=' . DB_HOST_USADOS . ';dbname=' . DB_NAME_USADOS, DB_USER_USADOS, DB_PASS_USADOS, $options); 
       break; 

      case 'autos': 
       parent::__construct(DB_TYPE_AUTOS . ':host=' . DB_HOST_AUTOS . ';dbname=' . DB_NAME_AUTOS, DB_USER_AUTOS, DB_PASS_AUTOS, $options); 
       break; 

      case 'servicos': 
       parent::__construct(DB_TYPE_SERVICOS . ':host=' . DB_HOST_SERVICOS . ';dbname=' . DB_NAME_SERVICOS, DB_USER_SERVICOS, DB_PASS_SERVICOS, $options); 
       break; 

      default: 
       parent::__construct(DB_TYPE_MYSQL . ':host=' . DB_HOST_MYSQL . ';dbname=' . DB_NAME_MYSQL, DB_USER_MYSQL, DB_PASS_MYSQL, $options); 
       break; 
     } 
    } 
} 

而且在示例模型中,我有:

class Note_Model extends Model { 

    public $errors = array(); 

    public function __construct() { 
     parent::__construct($dbconn="mysql"); 
    } 

    public function getAllNotes() { 
     $sth = $this->db->prepare("SELECT user_id, note_id, note_text 
            FROM note 
            WHERE user_id = :user_id ;"); 
     $sth->execute(array(':user_id' => $_SESSION['user_id']));  

     return $sth->fetchAll(); 
    } 
} 

我有2個問題:

  1. 在我的數據庫類,是我的方法爲不同的數據庫連接(將使用不同的m odels)好嗎?交換機結構是否適用於這種情況,以及哪裏可以連接的變量?

  2. 我可以連接到不同模型的不同數據庫,但是如果我有需要,如何從1個相同模型的不同數據庫中獲取數據。例如,在顯示來自不同來源的信息的儀表板中。這不僅僅是$ this-> db,是嗎?

謝謝你的進步。

+1

僅供參考,在OOP中'extends'關鍵字與** IS A **同義。你確定*「Note_Model」是一個PDO *嗎?另外,MVC中的模型是一個層,而不是**類。 –

+0

嗨特雷斯科!那麼,如果我需要一個「Note_Model」,它不應該是一個模型嗎?那麼我能做些什麼來使它成爲一個層? – mjpramos

回答

1

構造函數中的switch語句是一種代碼異味,指示類正在做太多事情。我會創建4個類(擴展PDO或您自己的基類)並使用它們。

關於模型,我不是MVC的專家,但我知道如果他們在同一臺服務器上,可以在不同的數據庫中連接表。但是,這可能會導致一個「老闆」類破壞每個類的一個數據庫規則。最好的方法可能是讓另一個類詢問你需要的數據模型,然後將它們拼湊在一起。

+0

嗨!喬治,謝謝。關於我的第二個問題,你會採取什麼做法? – mjpramos

+0

嗯。看我的編輯。 –