Использование набора типов данных Mysql с доктриной 1.2


Мы используем базу данных из устаревшей системы, которая включает поля с набором типов (http://dev.mysql.com/doc/refman/5.0/en/set.html)

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

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

Author: adlawson, 2011-08-11

1 answers

Мне удалось решить эту проблему. Вам необходимо переопределить класс datadict, используемый для адаптера подключения (в нашем случае doctrine_datadict_mysql)

Я зарегистрировал пользовательский класс подключения с помощью

$manager = Doctrine_Manager::getInstance();
$manager->registerConnectionDriver('mysql', 'My_Doctrine_Connection_Mysql');

В my_doctrine_connection_mysql my_doctrine_connection_mysql:

class My_Doctrine_Connection_Mysql extends Doctrine_Connection_Mysql
{
    /**
     * Data Dict(ator|ionary)?
     * @var My_Doctrine_DataDict_Mysql
     */
    protected $_dataDict;

    /**
     * __get Overloading method
     * @param string $name
     * @return mixed
     */
    public function __get($name)
    {
        if ('dataDict' === $name) {
            if (null === $this->_dataDict) {
                $this->_dataDict = new My_Doctrine_DataDict_Mysql($this);
            }

            return $this->_dataDict;
        }

        return parent::__get($name);
    }
}

И в my_doctrine_datadict_mysql:

class My_Doctrine_DataDict_Mysql extends Doctrine_DataDict_Mysql
{
    /**
     * @see parent::getPortableDecleration
     * @param array $field
     * @return array
     */
    public function getPortableDeclaration(array $field)
    {
        $definition = parent::getPortableDeclaration($field);

        // Normalising field type. Pulled almost exactly from parent
        $length = null;
        $dbType = strtolower($field['type']);
        $dbType = strtok($dbType, '(), ');
        if ($dbType == 'national') {
            $dbType = strtok('(), ');
        }
        if (isset($field['length'])) {
            $length = $field['length'];
        } else {
            $length = strtok('(), ');
            $decimal = strtok('(), ');
        }

        // Set definition
        switch ($dbType) {
            case 'set':
                $definition['type'] = array('set');
                break;
        }

        return $definition;
    }
}
 1
Author: adlawson, 2011-08-15 02:20:30