确定Zend框架中的MySQL查询类型


Determine MySQL query type in Zend Framework

谁能告诉我如何确定查询类型选择,更新,删除或插入在MySQL上执行之前。

我坚信Zend框架内部可能会使用mysql*_query函数来执行它们。

我需要一个集中的函数,它将在执行前返回查询类型。

我为每个数据库表使用三个文件

我给你举个例子。

假设我想为类别表创建模型。

所以我将创建以下文件

数据表/Categories.php

class Application_Model_DbTable_Categories extends Zend_Db_Table_Abstract {
    protected $_name = 'categories';
    protected $_dependentTables = array('Application_Model_DbTable_Videos');
}

Categories.php

class Application_Model_Categories extends Application_Model_CommonGetterSetter {
    protected $_type = array('id' => 'int', 'name' => 'string', 'slug' => 'string', 'status' => 'int');
    public function __construct(array $options = null) {
        parent::__construct($options, __CLASS__);
    }
}

CategoriesMapper.php

class Application_Model_CategoriesMapper {
    protected $_dbTable;
    public function setDbTable($dbTable) {
        if (is_string($dbTable)) {
            $dbTable = new $dbTable();
        }
        if (!$dbTable instanceof Zend_Db_Table_Abstract) {
            throw new Exception('Invalid table data gateway provided');
        }
        $this->_dbTable = $dbTable;
        return $this;
    }

    public function getDbTable() {
        if (null === $this->_dbTable) {
            $this->setDbTable('Application_Model_DbTable_Categories');
        }
        return $this->_dbTable;
    }

    public function save(Application_Model_Categories $categories) {
        $data = array(
                'name'      => $categories->name,
                'slug'      => $categories->slug,
                'status'    => $categories->status,
        );
        if (@$categories->id <= 0) {
            return $this->getDbTable()->insert($data);
        } else {
            $this->getDbTable()->update($data, array('id = ?' => $categories->id));
            return $categories->id;
        }
    }

CommonGetterSetter.php

class Application_Model_CommonGetterSetter {
    protected $_data = array();
    private $_class_name;
    public function __construct(array $options = null, $class_name = null) {
        if (is_array($options)) {
            foreach ($options as $key => $value) {
                $this->$key = $value;
            }
            $this->_class_name = $class_name;
        }
    }
    public function __set($name, $value) {
        if (!array_key_exists($name, $this->_type)) {
            throw new Exception("Invalid {$this->_class_name} property". $name);
        }
        else {
            settype($value, $this->_type[$name]);
            $this->_data[$name] = $value;
        }
    }
    public function __get($name) {
        if (!array_key_exists($name, $this->_type)) {
            throw new Exception("Invalid {$this->_class_name} property". $name);
        }
        else {
            return $this->_data[$name];
        }
    }
}

所以我想知道哪个查询被执行了,我应该在哪里写什么?

我提前感谢。

我知道代码有点长,但这是给一个完整的想法。

我坚信Zend框架内部可能会使用mysql*_query函数来执行它们。

ZF的数据库类不支持过时的mysql扩展名。它有PDO和mysqli的适配器。你会知道你在使用哪个,因为你必须在你的代码或配置中明确指定一个

所以我想知道哪个查询被执行了

我认为重新考虑你的设计会对你有更好的好处。这里不完全清楚发生了什么,也不清楚为什么您认为需要知道查询类型,也不清楚您希望在哪里需要知道查询类型。

请查看Zend_Db_Table文档,因为看起来您可能在某个地方错过了要点。

具体来说,Zend_Db_Table已经提供了插入、删除和更新的方法。如果您需要更改适当方法的行为,您应该通过简单地在您的类中重写它来实现。

此外,看起来您正在尝试构建某种智能列类型定义系统。您不需要这样做,因为Zend_Db_Table已经为您提供了这些信息,如果您不希望它自动确定这些信息,甚至允许您对其进行硬编码。

ZF是一头复杂的野兽。如果您打算使用它,我建议您充分了解它的所有功能。构建非标准的、冗余的架构只会让你以后的事情变得更复杂。

编辑:我正在查看Zend_Db_Table和Zend_Db_Table_Abstract的代码,我的第二个解决方案现在似乎更困难了。

嘿伙计们,

如果你想让自己有点头疼,你可以做的就是继续使用multidb资源创建两个连接,一个连接从服务器,一个连接主服务器。

将默认连接设置为使用最多的连接。

然后,在另一个连接中,您可以在每次需要使用它时手动获取它,并直接与适配器处理,而不是通过DbTable类。

例如,为映射器类创建另一个名为getOtherDbAdapter()的方法,该方法获取另一个适配器。然后,您可以从那里使用适配器来执行选择或插入。

哦!

另一个解决方案是,您可以扩展类Zend_Db_Table或Zend_Db_Table_Abstract,并为第二个db连接创建另一个变量。

然后,复制并粘贴从Zend_Db_Table_Abstract类的所有获取/选择/插入/更新方法的实现代码,并让它使用另一个适配器,每当你看到代码执行的操作,你想要重定向到另一个数据库