在Zend Framework中过滤SELECT和INSERT / UPDATE / DELETE查询

时间:2010-12-09 09:13:06

标签: zend-framework frameworks filter

我在Zend Framework中使用multidb模式。

通常我会使用MysqlDB的主/从架构。

所以我的问题是如何从slave数据库执行SELECT查询和在master数据库上执行INSERT / UPDATE / DELETE查询

我的application.ini看起来像

resources.multidb.primary.adapter = PDO_MYSQL
resources.multidb.primary.host = localhost
resources.multidb.primary.username = root
resources.multidb.primary.password = 123456
resources.multidb.primary.dbname = tubaah_zend
resources.multidb.primary.default = true

resources.multidb.secondary.adapter = PDO_MYSQL
resources.multidb.secondary.host = localhost
resources.multidb.secondary.username = root
resources.multidb.secondary.password = 123456
resources.multidb.secondary.dbname = tubaah

所以我想在辅助数据库上运行所有SELECT查询,在主数据库上运行所有INSERT / UPDATE / DELETE。

2 个答案:

答案 0 :(得分:1)

我认为插入/更新/删除应该可以正常工作,即:

My_Model_DbTable_MyTable.php:

function myFunction() {
    $this->insert()
    $this->update()
    $this->delete()
}

但是,如果您希望使用辅助数据库,则可能无法使用典型的$ this-> select()方法:

My_Model_DbTable_MyTable.php

// Override getAdapter() function to be able to obtain secondary database
function getAdapter($name = 'primary') {
    $resource = $this->getPluginResource('multidb');
    $resource->init();

    // Ensure only primary and secondary are allowed
    if ($name == 'secondary' || $name == 'primary') {
        return $resource->getDb($name);
    } else {
        return $this->_db;
    }
}

function selectFromSecondary() {
    $db = $this->getAdapter('secondary');
    $select = $this->select(true);
    return $db->fetchAll($select); // normally this is $this->fetchAll()
}

同样,通过覆盖如上所示的getAdapter(),如果访问主数据库,则无需进行任何更改,但如果您需要辅助数据库,则需要通过$ this->获取辅助适配器。 getAdapter('secondary')并将其存储到变量(即$ db)中,然后使用$ db对象调用select / insert / update / delete方法。

编辑 对上面的代码进行轻微修改。您应该尝试使用$ this-> _db默认为getAdapter()和$ db->替换$ this-> for fetch(),update(),insert(),delete()等,不适用于select()。

答案 1 :(得分:1)

function getAdapter($name = 'primary') {
    $resource = $this->getPluginResource('multidb');
    $resource->init();

    // Ensure only primary and secondary are allowed
    if ($name == 'secondary' || $name == 'primary') {
        return $resource->getDb($name);
    } else {
        return $this->_db;
    }
}

function selectFromSecondary() {
    $db = $this->getAdapter('secondary');
    $select = $this->select(true);
    return $db->fetchAll($select); // normally this is $this->fetchAll()
}