Doctrine + symfony 1.4 – Alterando o nome das sequences do Oracle utilizadas pelo Doctrine

A seguir veremos como alterar no symfony o nome das sequences utilizadas pelo Doctrine.

Por padrão, os nomes das sequences são gerados automaticamente pelo Doctrine seguindo o formato: nomeTabela_seq (‘%s_seq’)

Mas, onde e como posso alterar o nome das sequences, por um novo padrão ou definir um nome para cada modelo independentemente de um formato fixo, para meu banco de dados existente?

Para definir um nome diferenciado de sequence para cada modelo, você deve informar o parâmetro “sequence” na chave primária do modelo desejado em seu esquema do banco de dados (schema.yml). Por exemplo, digamos que o nome de sua sequence para o modelo (tabela) Area seja SEQ_AREA:


Area:
  tableName: AREA
  columns:
    cd_area:      { type: integer(3), primary: true, sequence: SEQ_AREA}
    descricao:    { type: string(255) }

Ao verificar o SQL da sequence na barra de ferramentas para debug web o nome da sequence ainda continua incorreto, pois será adicionado o padrão do Doctrine %s_seq:

SELECT SEQ_AREA_seq.nextval FROM DUAL

O Doctrine nos permite modificar uma série de configurações antes de carregar os modelos através das configurações globais. Você pode verificar as configurações disponíveis na documentação do Doctrine.

O atributo que precisamos alterar agora é o ATTR_SEQNAME_FORMAT que, como o nome sugere, modifica o formato do nome das sequences.
Os atributos globais são setados através da instância singleton Doctrine_Manager.

No symfony, as configurações globais do Doctrine são definidas na classe config/ProjectConfiguration.class.php
através do método configureDoctrine.

Vamos modificar então o atributo ATTR_SEQNAME_FORMAT, onde podemos definir o formato para aceitar qualquer
nome de sequence informado com o atributo “sequence” no schema:


<?php

require_once '/var/www/lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';
sfCoreAutoload::register();

class ProjectConfiguration extends sfProjectConfiguration{

  public function setup(){
    $this->enablePlugins('sfDoctrinePlugin', 'sfDoctrineGuardPlugin');
  }

  public function configureDoctrine(Doctrine_Manager $manager){
    $manager->setAttribute(Doctrine::ATTR_SEQNAME_FORMAT, '%s');
  }
}

Observação: Ao definir o nome da sequence com o atributo “sequence” no esquema do banco de dados, não deve-se utilizar o atributo “autoincrement: true”.