2015-05-26 109 views
5

我想在yii2框架上使用多個數據庫連接。在config文件夾裏面我db.php中的文件,我有這樣的一段代碼:yii2上的多個數據庫連接

return [ 
    'class' => 'yii\db\Connection', 
    'components' => [ 
     'db1' => [ 
      'class' => 'yii\db\Connection', 
      'dsn' => 'mysql:host=localhost;dbname=new', 
      'username' => 'root', 
      'password' => 'password', 
      'charset' => 'utf8', 
     ], 
     'db2' => [ 
      'class' => 'yii\db\Connection', 
      'dsn' => 'mysql:host=localhost;dbname=old', 
      'username' => 'root', 
      'password' => 'password', 
      'charset' => 'utf8', 
     ], 
    ], 
]; 

在我的test.php的模型文件夾下,我有這個下面......

namespace app\models; 

use Yii; 
use yii\base\Model; 
use yii\db\Query; 

class GetAds extends Model 
{ 
    public function ads() 
    { 

     $test = Yii::$app->db1->createCommand((new \yii\db\Query)->select('*')->from('members'))->queryAll(); 

    } 

時我嘗試訪問,我收到此錯誤消息「獲取未知的屬性:yii \ web \ Application :: db1」

如何解決此問題?我實際上遵循了這個指南Multiple database connections and Yii 2.0

我在哪裏做錯了?

最糟糕的是,我已經設置只使用一個數據庫...和我的模型,我用這個代碼..

namespace app\models; 

    use Yii; 
    use yii\base\Model; 
    use yii\db\ActiveRecord; 
    use yii\db\Query; 

    class GetAds extends ActiveRecord 
    { 
     public static function tableName() 
     { 
      return 'ads_page'; 
     } 

     public static function ads() 
     { 

      $count=(new \yii\db\Query)->from('ads_page')->count('*'); 
    } 
} 

而且我得到這個錯誤

Database Exception – yii\db\Exception 
could not find driver 
↵ 
Caused by: PDOException 
could not find driver 

爲什麼要用yii2這麼辛苦?我已經遵循所有從這裏http://www.yiiframework.com/doc-2.0/guide-db-dao.html

請幫助

+0

在我看來,這有沒有關係的Yii在所有...「找不到驅動程序」看起來更像是一個「PDO」錯誤。你確定所有相關的php模塊都已安裝嗎?單靠PDO是不夠的,它需要'mysqlnd'以及iirc – Blizz

+0

@Blizz,謝謝你的提示,我已經使用WAMP在PHP設置下啓用了pdo_mysql ....這解決了PDO問題。 – nodeffect

+0

你合併你的數據庫配置與其他配置數組? – Tony

回答

4

我已經解決了這個問題。這可能有助於其他需要此功能的人。

在配置/ web.php,我加入這行「'db2' => require(__DIR__ . '/db2.php'),」剛下這個說法「'db' => require(__DIR__ . '/db.php'),」(不帶引號)

,並使用代碼作爲同一創建的配置文件夾下的另一個新文件db2.php在db.php中:

<?php 

return [ 
    'class' => 'yii\db\Connection', 
    'dsn' => 'mysql:host=localhost;dbname=test2', 
    'username' => 'root', 
    'password' => 'password', 
    'charset' => 'utf8', 
]; 

並調用第一個數據庫。我用這個:

$row = Yii::$app->db->createCommand("SELECT * FROM test")->queryOne(); 

從第二數據庫查詢表,我用這個:

$row = Yii::$app->db2->createCommand("SELECT * FROM test2")->queryOne(); 
+1

,然後檢出以下鏈接 http://www.yiiframework.com/doc-2.0/guide-db-dao .html – kurmi

+0

如果我使用ActiveRecord而不是使用'Yii :: $ app :: db-> createCommand..',例如,如果我已經使用了'ModelName :: find() - > all()''在我的應用程序中,現在我希望我的所有客戶都爲他們的公司使用不同的數據庫。我如何以及在哪裏告訴應用程序使用哪個數據庫? –

1
  1. 確保您有php_mysqlphp_pdo_mysql擴展安裝 。
  2. \yii\db\ActiveRecord類應該知道它的工作是什麼數據庫

這是代碼爲您添加到模型中,使其認識到它的數據庫中。

public static function getDb() 
{ 
    return Yii::$app->get('db1'); 
} 
+0

如果我使用ActiveRecord而不是使用Yii :: $ app :: db-> createCommand。例如,如果我已經在我的應用程序中使用了類似於ModelName :: find() - > all()的活動記錄方法,現在我希望我的所有客戶端都爲他們的公司使用不同的數據庫。我如何以及在哪裏告訴應用程序使用哪個數據庫?如果在主/從模式下使用多個分貝,ActiveRecord分類總是會調用此函數'getDb()' –