代码之家  ›  专栏  ›  技术社区  ›  Haim Evgi

如何在zend框架上连接到另一个具有条令的db

  •  1
  • Haim Evgi  · 技术社区  · 15 年前

    我使用Zend Framework 1.10,并将其与原则1.2集成。

    应用程序.ini 档案,我宣布 dsn公司

    在我的应用程序中,我需要连接到另一个数据库来运行一些查询。

    我该怎么做?

    我只需要运行查询,我不想为这个数据库生成所有的模型。

    就在现在 引导.php 我执行默认连接:

         protected function _initDoctrine()
            {
                $this->getApplication()->getAutoloader()
                    ->pushAutoloader(array('Doctrine', 'autoload'));
                spl_autoload_register(array('Doctrine', 'modelsAutoload'));
    
                $doctrineConfig = $this->getOption('doctrine');
                $manager = Doctrine_Manager::getInstance();
                $manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
                $manager->setAttribute(
                  Doctrine::ATTR_MODEL_LOADING,
                  $doctrineConfig['model_autoloading']
                );
    
                Doctrine_Core::loadModels($doctrineConfig['models_path']);
    
                $conn = Doctrine_Manager::connection($doctrineConfig['dsn'],'doctrine');
                $conn->setAttribute(Doctrine::ATTR_USE_NATIVE_ENUM, true);
                Doctrine_Core::generateModelsFromDb('models', array('doctrine'), array('generateTableClasses' => true));
             return $conn;
    }
    
    3 回复  |  直到 13 年前
        1
  •  1
  •   DrColossos    15 年前

    这是假定没有使用Zend或类似的规则学说!

    它已经存在于您的代码中,您只需在连接中添加另一行即可。我建议 http://www.doctrine-project.org/projects/orm/1.2/docs/manual/connections/en

    $conn = Doctrine_Manager::connection($doctrineConfig['dsn'],'doctrine');
    

    这是与名称的连接 doctrine

    Doctrine_Manager::connection($doctrineConfig['dsn'],'second_connection');
    

    现在你有了两个连接,你已经知道了 second_connection .

    阅读上面的链接,了解如何处理不同连接的检索。查询模型时,可以定义要用作可选参数的连接。

        2
  •  3
  •   jsuggs    15 年前

    您还可以将条令实例存储在Zend\u注册表中,并在以后检索所需的条令实例。

    $conn1 = Doctrine_Manager::connection(...);
    Zend_Registry::set('conn1',$conn1);
    
    $conn2 = Doctrine_Manager::connection(...);
    Zend_Registry::set('conn2',$conn2);
    

    $conn1 = Zend_Registry::get('conn1');
    $conn2 = Zend_Registry::get('conn2');
    
        3
  •  1
  •   wimvds    15 年前

        <databases>
            <db_one>
                <adapter>pdo_mysql</adapter>
                <params>
                    <dbname>...</dbname>
                    <username>...</username>
                    <password>...</password>
                    <host>...</host>
                    <port>...</port>
                </params>
            </db_one>
            <db_two>
                <adapter>pdo_mysql</adapter>
                <params>
                    <dbname>...</dbname>
                    <username>...</username>
                    <password>...</password>
                    <host>...</host>
                    <port>...</port>
                </params>
            </db_two>
        </databases>
    

    (当然,它们并不是真的叫做db_one和db_two,而是有一个恰当的名称:p)。

    您可以按如下方式初始化DB连接(在引导程序中的某个地方调用它):

    private function initDb()
    {
        foreach ($this->config->databases as $name => $database) {
            try {
                $db = Zend_Db::factory($database);
                // Hack for MySQL utf8 encoding...
                if ($database->adapter == 'pdo_mysql') {
                    $db->getConnection();
                    $db->query('SET NAMES utf8');                   
                }
                Zend_Registry::set($name, $db);
            } catch (Zend_Db_Adapter_Exception $e) {
                throw new Application_Exception($e->getMessage());
            } catch (Zend_Exception $e) {
                throw new Application_Exception($e->getMessage());
            }
        }
    }
    

    然后,如果要在代码中的任意位置对db_two执行查询,可以使用:

    $db = Zend_Registry::get('db_two');
    $stmt = $db->query('select ... from ...');
    

    顺便说一句,您不必使用ZendèRegistry并在每次请求时打开所有连接,因此只需将此作为示例实现,而不是解决问题的指导原则。

    推荐文章