使用Mysql数据类型使用Doctrine 1.2进行设置

时间:2011-08-11 16:08:48

标签: php mysql doctrine set doctrine-1.2

我们正在使用旧系统中的数据库,其中包含类型为Set(http://dev.mysql.com/doc/refman/5.0/en/set.html)的字段

我们需要不断从数据库中生成基础模型。数据库中类型为Set的字段将在基本模型中生成为Text类型。

手动将字段更改为“set”会为我们提供所需的结果,但有没有办法让学说正确地生成模型?

1 个答案:

答案 0 :(得分:1)

我设法解决了这个问题。您需要覆盖用于连接适配器的DataDict类(在我们的示例中, Doctrine_DataDict_Mysql

我使用

注册了自定义连接类
$manager = Doctrine_Manager::getInstance();
$manager->registerConnectionDriver('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;
    }
}