【问题标题】:How to make doctrine ignore database column prefixes?如何让学说忽略数据库列前缀?
【发布时间】:2011-08-10 20:48:54
【问题描述】:

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

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

【问题讨论】:

    标签: doctrine symfony


    【解决方案1】:

    我认为你可以这样添加名称:

    Doctrine\Tests\ORM\Mapping\User:
        fields:
            created:
                name: dt_created
                type: datetime
    

    你可以看到:

    【讨论】:

      【解决方案2】:

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

      希望这会有所帮助。

      【讨论】:

      • 或者,在生成实体之前,编辑doctrine:mapping:import转储出来的配置文件?
      【解决方案3】:

      您可以修补 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);
        }
        

      我的方法很简单,因为我的前缀都是一致的(我的想法来自 Media Wiki),你的可能更复杂。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-30
        • 1970-01-01
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-17
        相关资源
        最近更新 更多