Определить тип запроса MySQL в Zend Framework - PullRequest
0 голосов
/ 05 апреля 2011

Может кто-нибудь сказать мне , как определить тип запроса , т.е. выбрать, обновить, удалить или вставить до того, как он будет выполнен через 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];
        }
    }
}

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

Мни, спасибо заранее.

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

Ответы [ 2 ]

4 голосов
/ 06 апреля 2011

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

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

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

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

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

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

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

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

0 голосов
/ 07 апреля 2011

РЕДАКТИРОВАТЬ: я искал код для Zend_Db_Table и Zend_Db_Table_Abstract, и мое второе решение кажется гораздо сложнее.

Привет, ребята,

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

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

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

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

OH!

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

Затем скопируйте и вставьте код реализации для всех методов fetch / select / insert / update из класса Zend_Db_Table_Abstract и попросите его использовать другой адаптер всякий раз, когда вы видите код, выполняющий операции, которые вы хотите перенаправитьк другому БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...