2011-08-10 35 views
0

通常创建我在Symfony2中/学说实体从这个控制台命令:如何使doctrine忽略数据库列前缀?

$php app/console doctrine:mapping:import TestSiteBundle yml 
$php app/console doctrine:generate:entities Test --path=src/ 

但我的表列有这样的前缀:

table: user 
id_user 
id_address (FK) 
nm_name 
dt_created 
bl_active 

,并产生这样的实体:

$idUser 
$idAdress 
$nmName 
$dtCreated 
$blActive 

我怎样才能忽略我的列前缀?我是否需要更改我的整个数据库列名称?

回答

1

就这样,我明白了,您希望您的数据库列名称为id_user,并且您希望实体属性为$user?如果是这样,我认为没有对核心库进行严重黑客攻击是不可能的。基本上你需要拦截生成实体属性的部分并添加你自己的规则来说明如何命名它们。重命名你的列会更好。恕我直言,这些前缀是不必要的。我会将id_user更改为user_id,nm_namename,dt_createdcreated_atbl_activeis_active。你的列名和属性名不但会匹配(这是一件好事),而且它们会更有意义。

希望这会有所帮助。

+0

或者,在生成实体之前,编辑'doctrine:mapping:import'转储出来的配置文件? – Problematic

2

您可以修补主义到后剥离前缀对数据库进行逆向工程。

  1. 打开此文件中的IDE:https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php
  2. Add方法class DatabaseDriver implements Driver

    private function deprefixFieldName($fieldName) { 
        return implode('_',array_slice(explode('_',$fieldName),1)); 
    } 
    
  3. 编辑方法:

    public function setFieldNameForColumn($tableName, $columnName, $fieldName) 
    { 
        /* ADD */ $fieldName = $this->deprefixFieldName($fieldName); 
        $this->fieldNamesForColumns[$tableName][$columnName] = $fieldName; 
    } 
    
  4. 编辑方法:

    private function getFieldNameForColumn($tableName, $columnName, $fk = false) 
    { 
        /* ... */ 
        /* ADD */ $columnName = $this->deprefixFieldName($columnName); 
        return Inflector::camelize($columnName); 
    } 
    

我的方法非常简单,因为我的前缀都是一致的(我从Media Wiki中获得了这个想法),您的方法可能会更复杂。

下面是Git从工作系统中采取的实际补丁,以防我在描述中输入错字:http://pastebin.com/FHeTCUjZ(我想知道帖子中的补丁是否允许)。