Использование типа данных Mysql Set with Doctrine 1.2 - PullRequest
2 голосов
/ 11 августа 2011

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

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

Ручное изменение полей на «set» дает нам желаемый результат, но есть ли способ получить доктрину для правильного создания моделей для начала?

1 Ответ

1 голос
/ 11 августа 2011

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

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

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

In 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;
    }
}
...