谁能告诉我如何确定查询类型即选择,更新,删除或插入在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类的所有获取/选择/插入/更新方法的实现代码,并让它使用另一个适配器,每当你看到代码执行的操作,你想要重定向到另一个数据库