我们正在使用旧系统中的数据库,其中包含类型为Set(http://dev.mysql.com/doc/refman/5.0/en/set.html)的字段
我们需要不断从数据库中生成基础模型。数据库中类型为Set的字段将在基本模型中生成为Text类型。
手动将字段更改为“set”会为我们提供所需的结果,但有没有办法让学说正确地生成模型?
答案 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;
}
}