Eduardo Moniz
Eduardo Moniz

Reputation: 2115

How to make doctrine ignore database column prefixes?

Typically i create my entities in symfony2/doctrine from this console commands :

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

but my table columns have prefixes like this :

table: user
id_user
id_address (FK)
nm_name
dt_created
bl_active

and it generates entities like this :

$idUser
$idAdress
$nmName
$dtCreated
$blActive

how can i ignore my column prefixes ? do i need to change my entire database column names ?

Upvotes: 0

Views: 2346

Answers (3)

Sergey Nagaytsev
Sergey Nagaytsev

Reputation: 69

You can patch Doctrine to strip prefixes upon reverse engineering of your database.

  1. Open this file in IDE: https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php
  2. Add method to class DatabaseDriver implements Driver :

    private function deprefixFieldName( $fieldName ) {
        return implode('_',array_slice(explode('_',$fieldName),1));
    }
    
  3. Edit method:

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

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

My method is so simple because my prefixes are all consistent ( i took the idea from Media Wiki ), yours may be more complex.

Here's the actual patch taken by Git from working system, just in case i made a typo in description: http://pastebin.com/FHeTCUjZ ( i wonder if patches in posts are allowed).

Upvotes: 1

julesbou
julesbou

Reputation: 5780

I think you can add the name like this:

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

you can see:

Upvotes: 2

Steven Mercatante
Steven Mercatante

Reputation: 25295

Just so I understand, you want your database column name to be id_user and you want the entity property to be $user? If so, I don't think that's possible without doing some serious hacking of the core libraries. Basically you'd need to intercept the part that generates the entity properties and add your own rules on how to name them. You'd be much better off renaming your columns. IMHO, those prefixes are unnecessary. I would change id_user to user_id, nm_name to name, dt_created to created_at, and bl_active to is_active. Your column names and property names will not only match (this is a good thing) but they'll make more sense.

Hope this helps.

Upvotes: 1

Related Questions