【问题标题】:Multiple Databases Connection on yii2yii2上的多个数据库连接
【发布时间】:2015-08-07 20:25:45
【问题描述】:

我正在尝试在 yii2 框架上使用多个数据库连接。在 config 文件夹内的 db.php 文件下,我有这段代码:

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',
        ],
    ],
];

在我的models文件夹下的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();

    }

当我尝试访问时,我收到此错误消息“Getting unknown property: 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

请帮忙

【问题讨论】:

  • 在我看来,这与 Yii 一点关系都没有……“找不到驱动程序”似乎更像是 PDO 错误。你确定所有相关的php模块都安装了吗?仅PDO 是不够的,还需要mysqlnd iirc
  • @Blizz,感谢您的提示,我已经使用 WAMP 在 PHP 设置下启用了 pdo_mysql .... 这解决了 PDO 问题。
  • 您是否将您的数据库配置与其他配置数组合并?

标签: php database yii2 multiple-databases


【解决方案1】:

我已经解决了这个问题。这可能会帮助其他需要的人。

在 config/web.php 下,我在语句“'db' => require(__DIR__ . '/db.php'),”下方添加了这一行“'db2' => require(__DIR__ . '/db2.php'),”(不带引号)

并使用与 db.php 中相同的代码在 config 文件夹下创建了另一个新的 db2.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();

【讨论】:

  • 如果在主/从模式下使用多个数据库,请查看以下链接yiiframework.com/doc-2.0/guide-db-dao.html
  • 如果我使用 ActiveRecord 而不是使用Yii::$app::db-&gt;createCommand.. 会怎样,例如,如果我已经在我的应用程序中使用了像ModelName::find()-&gt;all() 这样的活动记录方法,现在我希望我所有的客户都为他们的公司使用不同的数据库.我如何以及在哪里告诉应用程序使用哪个数据库?
【解决方案2】:

你也可以这样做:

new User(array("db" => Yii::$app->db1));

或者这样做:

User::find()->where(...)->all(Yii::$app->db2);

【讨论】:

    【解决方案3】:
    1. 确保您有 php_mysqlphp_pdo_mysql 扩展名 已安装。
    2. \yii\db\ActiveRecord 类应该知道它正在使用什么数据库

    这是您添加到模型以使其了解其数据库的代码。

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

    【讨论】:

    • 如果我使用 ActiveRecord 而不是 Yii::$app::db->createCommand.. 例如,如果我已经使用了 ModelName::find()->all( ) 在我的应用程序中,现在我希望我的所有客户都为他们的公司使用不同的数据库。我如何以及在哪里告诉应用程序使用哪个数据库? ActiveRecord 类是否总是调用这个函数getDb()
    猜你喜欢
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多