Firebird


(Newerton Araujo) #1

Ó eu denovo! :P

Peguei um sistema para desenvolver que seria basicamente um orçamento online, mais o banco de dados fica na loja física dessa empresa, e o banco de dados é firebird :(

Bom até ae tudo bem, apanhei uns 3 dias para fazer funcionar o firebird local mais consegui hehehe

O unico problema ou digamos que seja quase impossivel, mais tem alguma forma de fazer o Model Generator do Gii, pegar outra conexão do banco dados? Vou usar o ‘db’ para gerenciar a administração, mais o produtos e pedidos vou fazer direto com outro banco de dados ‘fb’.




'db' => array(

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

            'emulatePrepare' => true,

            'username' => '****',

            'password' => '****',

        ),

        'fb' => array(

            'connectionString'=>'firebird:dbname=localhost:F:\***\PASTOS.FDB',

            'emulatePrepare' => true,

            'username' => 'SYSDBA',

            'password' => 'masterkey',

        ),



Por padrão o Gii pega a conexão ‘db’, queria gerar os model do ‘fb’, eu comento o ‘db’, e no ‘fb’ coloco ‘db’, ai funciona, é possível gerar sem fazer essa invensão toda?


(Newerton Araujo) #2

Criei em protected/components/FirebirdActiveRecord.php




<?php


abstract class FirebirdActiveRecord extends CActiveRecord {

    const BELONGS_TO='CBelongsToRelation';

    const HAS_ONE='CHasOneRelation';

    const HAS_MANY='CHasManyRelation';

    const MANY_MANY='CManyManyRelation';

    const STAT='CStatRelation';


    /**

     * @var CDbConnection the default database connection for all active record classes.

     * By default, this is the 'db' application component.

     * @see getDbConnection

     */

    public static $db;

    private static $_models = array();            // class name => model

    private $_md;                               // meta data

    private $_new = false;                        // whether this instance is new or not

    private $_attributes = array();               // attribute name => attribute value

    private $_related = array();                  // attribute name => related objects

    private $_c;                                // query criteria (used by finder only)

    private $_pk;                               // old primary key value


    /**

     * Returns the database connection used by active record.

     * By default, the "db" application component is used as the database connection.

     * You may override this method if you want to use a different database connection.

     * @return CDbConnection the database connection used by active record.

     */


    public function getDbConnection() {

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

            return self::$db;

        else {


            // Create CDbConnection and set properties

            self::$db = new CDbConnection();

            foreach (Yii::app()->fb as $key => $value)

                self::$db->$key = $value;




            // Uncomment the following lines to prove that you have two database connections

            

              CVarDumper::dump(Yii::app()->db);

              echo '<br />';

              CVarDumper::dump(Yii::app()->fb);

              die;

             

            if (self::$db instanceof CDbConnection) {

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

                return self::$db;

            }

            else

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

        }

    }


}


?>




E no Model fico assim:


class AGENDA extends FirebirdActiveRecord{}

Isso funciona?

Se eu usar AGENDA::model()->findAll(), ele me traz tudo? Se eu precisa ficar usando consulta sql pura?

Por que um site que fiz pra um amigo, eu usei o ‘db’ e ‘db2’, mais o dois era mysql, eu chama por SQL fazia a query depois usava Yii::app()->db2->createCommand($sql)->query();

Se o ‘AGENDA::model()->findAll()’ funcionar, cada dia que passa o Yii se e me supera! hehe


(Newerton Araujo) #3

Sobre meu último post: FUNCIONA! hehe

Ralando e aprendendo! hehehe


(Rafaelquines) #4

Boa Newerton.

Mto bom saber que podemos apenas reescrever a classe CActiveRecord para fazer funcionar com qq outros bancos…

abraço


(Edgardmessias) #5

Para quem precisar usar o Firebird como banco de dados, podem usar essa extensão: http://www.yiiframework.com/extension/yiifirebird