Определить тип запроса MySQL в Zend Framework

Может ли кто-нибудь сказать мне, как определить тип запроса, т.е. выбирать, обновлять, удалять или вставлять, прежде чем он будет выполнен через MySQL.

Я твердо верю, что внутри Zend Framework может использовать функцию mysql * _query для их выполнения.

Мне нужна централизованная функция, которая вернет тип запроса до выполнения.

Я использую три файла для каждой таблицы базы данных

Я приведу вам пример.

Скажем, я хочу создать модель для таблицы категорий.

Поэтому я создам следующие файлы

DbTable / 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]; } } } 

Итак, я хочу узнать, какой запрос был выполнен, где и что мне писать?

Mny заранее.

Я знаю, что код немного длинный, но это должно было дать полную идею.

Я твердо верю, что внутри Zend Framework может использовать функцию mysql * _query для их выполнения.

Класс базы данных ZF не поддерживает ветхое расширение mysql. Он имеет адаптеры для PDO и mysqli . Вы узнаете, какой из них вы используете, потому что вы должны явно указать его в своем коде или конфигурации.

Поэтому я хочу узнать, какой запрос был выполнен

Я думаю, что вам будет лучше служить, переосмыслив ваш дизайн. Не совсем понятно, что здесь происходит, и не понятно, почему вы считаете, что вам нужно знать тип запроса, и не ясно, где вы должны знать тип запроса.

Просмотрите документацию Zend_Db_Table , так как похоже, что вы пропустили точку где-то на этом пути.

В частности, уже существуют методы, предоставляемые Zend_Db_Table для вставки, удаления и обновления. Если вам нужно изменить поведение соответствующего метода, вы должны сделать это, просто переопределив его в своем классе .

Кроме того, похоже, что вы пытаетесь создать некоторую систему определения типа интеллектуального столбца. Вам не нужно это делать, как и снова, Zend_Db_Table уже предоставляет вам эту информацию и даже позволяет вам жестко закодировать ее, если вы предпочтете, чтобы она не определяла эту информацию автоматически.

ZF – сложный зверь. Если вы собираетесь использовать его, я предлагаю вам полностью понять все, что он может сделать. Построение нестандартной, избыточной архитектуры только усложнит вас для вас.

EDIT: Я смотрел код для Zend_Db_Table и Zend_Db_Table_Abstract, и теперь мое второе решение кажется намного более сложным.

Эй, ребята,

Если вы хотите немного болеть головной болью, то вы можете использовать ресурс multidb для создания двух соединений, один для подчиненного и один для мастера.

Установите соединение по умолчанию с тем, которое будет использоваться больше всего.

Затем с помощью другого соединения вы можете извлекать его вручную каждый раз, когда вам нужно его использовать, и напрямую обращаться к адаптеру, а не проходить через класс DbTable.

Например, создайте другой метод для классов сопоставления, называемый getOtherDbAdapter (), который получает другой адаптер. Затем вы можете использовать адаптер оттуда для выполнения выбора или вставки.

ОЙ!

Другое решение состоит в том, что вы можете расширить расширение класса Zend_Db_Table или Zend_Db_Table_Abstract и создать другую переменную для второго соединения db.

Затем скопируйте и вставьте код реализации для всех методов выборки / выбора / вставки / обновления из класса Zend_Db_Table_Abstract и используйте его другим адаптером всякий раз, когда вы видите код, выполняющий операции, которые вы хотите перенаправить на другой db.