2011-08-10 74 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(我想知道帖子中的補丁是否允許)。