2015-05-26 24 views
5

Tôi đang cố sử dụng nhiều kết nối cơ sở dữ liệu trên khung yii2. Theo tập tin db.php của tôi bên trong thư mục cấu hình, tôi có đoạn mã này:Nhiều Cơ sở Dữ liệu Kết nối trên 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', 
     ], 
    ], 
]; 

Trong test.php của tôi trong thư mục mô hình, tôi có điều này dưới đây ...

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(); 

    } 

khi Tôi cố gắng truy cập, tôi nhận được thông báo lỗi này "Bắt tài sản không xác định: yii \ web \ Application :: db1"

Làm cách nào để giải quyết vấn đề này? Tôi đã thực sự làm theo hướng dẫn này Multiple database connections and Yii 2.0

Tôi đã làm sai ở đâu?

Điều tồi tệ nhất là, tôi đã thiết lập để sử dụng chỉ là một cơ sở dữ liệu ... và trên mô hình của tôi, tôi sử dụng mã này ..

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('*'); 
    } 
} 

Và tôi nhận được lỗi này

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

Tại sao sử dụng yii2 quá khó? Tôi đã làm theo tất cả từ đây http://www.yiiframework.com/doc-2.0/guide-db-dao.html

xin vui lòng giúp

+0

Dường như với tôi này không có gì để làm với Yii gì cả ... "không thể tìm thấy tài xế" có vẻ giống lỗi 'PDO' hơn. Bạn có chắc chắn tất cả các mô-đun php có liên quan được cài đặt không? 'PDO' một mình là không đủ, nó cần' mysqlnd' cũng như iirc – Blizz

+0

@Blizz, cảm ơn lời khuyên, tôi đã cho phép pdo_mysql trong PHP bằng cách sử dụng WAMP .... Điều đó giải quyết vấn đề PDO. – nodeffect

+0

bạn có hợp nhất cấu hình db của mình với các mảng cấu hình khác không? – Tony

Trả lời

4

Tôi đã giải quyết được sự cố này. Điều này có thể giúp những người khác cần điều này.

Dưới config/web.php, tôi đã thêm dòng này "'db2' => require(__DIR__ . '/db2.php')," chỉ dưới tuyên bố này "'db' => require(__DIR__ . '/db.php')," (không có dấu ngoặc kép)

và tạo ra một tập tin db2.php mới trong thư mục cấu hình bằng cách sử dụng mã tương tự như trong db.php:

<?php 

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

và gọi cơ sở dữ liệu đầu tiên. Tôi sử dụng này:

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

Để truy vấn bảng từ cơ sở dữ liệu thứ hai, tôi sử dụng này:

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

nếu sử dụng nhiều db trong chế độ master/slave sau đó kiểm tra liên kết dưới đây http://www.yiiframework.com/doc-2.0/guide-db-dao .html – kurmi

+0

nếu tôi sử dụng ActiveRecord thay vì sử dụng 'Yii :: $ app :: db-> createCommand..' chẳng hạn nếu tôi đã sử dụng các phương thức ghi hoạt động như' ModelName :: find() -> all() ' trong ứng dụng của tôi, bây giờ tôi muốn tất cả khách hàng của tôi sử dụng db khác nhau cho công ty của họ. làm thế nào và ở đâu để nói với các ứng dụng mà cơ sở dữ liệu để sử dụng? –

1
  1. Hãy chắc chắn rằng bạn có php_mysqlphp_pdo_mysql mở rộng cài đặt.
  2. Lớp \yii\db\ActiveRecord nên biết những gì cơ sở dữ liệu nó làm việc với

Đây là mã để bạn thêm vào các mô hình để làm cho nó biết về cơ sở dữ liệu của nó.

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

nếu tôi sử dụng ActiveRecord thay vì sử dụng Yii :: $ app :: db-> createCommand ..ví dụ nếu tôi đã sử dụng các phương thức ghi hoạt động như ModelName :: find() -> all() trong ứng dụng của tôi, bây giờ tôi muốn tất cả các khách hàng của tôi sử dụng db khác nhau cho công ty của họ. làm thế nào và ở đâu để nói với các ứng dụng mà cơ sở dữ liệu để sử dụng? ActiveRecord có được phân loại luôn thực hiện cuộc gọi đến hàm này 'getDb()' –

Các vấn đề liên quan