Подключение Ко Второй Бд

всем привет

не совсем понял логику использования подключения ко второй базе данных

[color="#FF0000"]получаю исключение[/color] Object configuration must be an array containing a "class" element eсли я использую такую схему =


$connection1=Yii::app()->db;

...

$res = $command->queryAll();


$connection2=Yii::app()->db2;

...

$res = $command->queryAll();

[color="#0000FF"]все хорошо[/color], если использую такую =


$connection1=Yii::app()->db;

...

$res = $command->queryAll();


$connection2=new CDbConnection('dsn','login','passw');

...

$res = $command->queryAll();

нужен хелп!

А как в конфиге вы определяете этот ‘db2’ ?

идентично первому подключению =


'db'=>array(

	'connectionString' => 'mysql:host=localhost;dbname=111',

	'emulatePrepare' => true,

	'username' => '111',

	'password' => '111',

	'charset' => 'utf8',

),

'db2'=>array(

	'connectionString' => 'mysql:host=localhost;dbname=222',

	'emulatePrepare' => true,

	'username' => '222',

	'password' => '222',

	'charset' => 'utf8',

),

По моему вы забыли в конфиге указать класс для 2го подключения:




'class'=>'CDbConnection'



И все таки возможно таки нужно переписать GetDbConnection() если хотите полноценный AR.

это понятно

я не то что забыл, а просто тупо скопировал первое подключение в котором тоже нет указания на класс

[color="#FF0000"]теперь все работает![/color]

спасибо, ineersa


Object configuration must be an array containing a "class"

Вот какраз и говорит что у вас в конфиге не было класса в возвращаемом массиве.

Дальше должно работать. Проверьте




Yii::app()->db->createCommand($sql)->execute();

Yii::app()->db2->createCommand($sql)->execute();



Если не нужен AR этого достаточно. Если же нужно стоит его подправить.




class MyActiveRecord extends CActiveRecord {

    ...

    private static $db2 = null;

 

    public function getDbConnection()

    {

        if (self::$db2 !== null)

            return self::$db2;

        else

        {

            self::$db2 = Yii::app()->db2;

            if (self::$db2 instanceof CDbConnection)

            {

                self::$db2->setActive(true);

                return self::$db2;

            }

            else

                throw new CDbException(Yii::t('yii','Active Record requires a "db" CDbConnection application component.'));

        }

    }

//в модели которая использует другую базу

class MyModel extends MyActiveRecord



Либо делаем как советует А.Макаров:




class Comment extends CActiveRecord {

    //…

 

    // отдаём соединение, описанное в компоненте db2

    public function getDbConnection(){

        return Yii::app()->db2;

    }

 

    // возвращаем имя таблицы вместе с именем БД

    public function tableName(){

         return 'db2.comment';

    }

 

    //…

}



Тут уже на любителя, но класс в конфиге обязателен, без него ничего не работает.

ну… не знаю…

когда я не подключал вторую БД, то первая работала и без указания класса

Ага. :rolleyes:

Она будет работать и сейчас без указания класса, а вот 2 и дальше нет.

Наверное потому, что в конфиге фреймворка класс для компонента “db” был указан по умолчанию и просто наследовался. А для вашего нового компонента “db2” такого наследования не было :)

спасибо всем!

p.s. трудно быть лохом… :lol:

Класс нужен чтобы yii знал что вы сейчас обьявляете DB connection. Иначе он этого не поймет, и будет ошибка.