如何使doctrine忽略数据库列前缀?

时间:2011-08-10 20:48:54

标签: doctrine symfony

通常我会从这个控制台命令在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

如何忽略我的列前缀?我需要更改整个数据库列名吗?

3 个答案:

答案 0 :(得分:2)

我认为您可以添加如下名称:

Doctrine\Tests\ORM\Mapping\User:
    fields:
        created:
            name: dt_created
            type: datetime
你可以看到:

答案 1 :(得分:2)

您可以修改Doctrine以在对数据库进行逆向工程时去除前缀。

  1. 在IDE中打开此文件:https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php
  2. 将方法添加到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);
    }
    
  5. 我的方法非常简单,因为我的前缀都是一致的(我从Media Wiki中获取了这个想法),你的前提可能更复杂。

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

答案 2 :(得分:1)

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

希望这有帮助。

相关问题