2011-08-11 2 views
2

Nous utilisons une base de données à partir d'un système existant qui comprend des champs de type Set (http://dev.mysql.com/doc/refman/5.0/en/set.html)utilisant le type de données Mysql série avec Doctrine 1.2

Nous devons générer des modèles de base en permanence à partir de la base de données. Les champs qui sont définis dans la base de données sont générés en tant que type Texte dans les modèles de base.

Modifier manuellement les champs pour 'définir' nous donne le résultat souhaité, mais y a-t-il un moyen de faire en sorte que la doctrine génère correctement les modèles pour commencer?

Répondre

1

J'ai réussi à résoudre le problème. Vous devez remplacer la classe de DataDict utilisée pour l'adaptateur de connexion (dans notre cas, Doctrine_DataDict_Mysql)

Je me suis inscrit une classe de connexion personnalisée avec

$manager = Doctrine_Manager::getInstance(); 
$manager->registerConnectionDriver('mysql', 'My_Doctrine_Connection_Mysql'); 

En My_Doctrine_Connection_Mysql:

class My_Doctrine_Connection_Mysql extends Doctrine_Connection_Mysql 
{ 
    /** 
    * Data Dict(ator|ionary)? 
    * @var My_Doctrine_DataDict_Mysql 
    */ 
    protected $_dataDict; 

    /** 
    * __get Overloading method 
    * @param string $name 
    * @return mixed 
    */ 
    public function __get($name) 
    { 
     if ('dataDict' === $name) { 
      if (null === $this->_dataDict) { 
       $this->_dataDict = new My_Doctrine_DataDict_Mysql($this); 
      } 

      return $this->_dataDict; 
     } 

     return parent::__get($name); 
    } 
} 

Et en My_Doctrine_DataDict_Mysql:

class My_Doctrine_DataDict_Mysql extends Doctrine_DataDict_Mysql 
{ 
    /** 
    * @see parent::getPortableDecleration 
    * @param array $field 
    * @return array 
    */ 
    public function getPortableDeclaration(array $field) 
    { 
     $definition = parent::getPortableDeclaration($field); 

     // Normalising field type. Pulled almost exactly from parent 
     $length = null; 
     $dbType = strtolower($field['type']); 
     $dbType = strtok($dbType, '(), '); 
     if ($dbType == 'national') { 
      $dbType = strtok('(), '); 
     } 
     if (isset($field['length'])) { 
      $length = $field['length']; 
     } else { 
      $length = strtok('(), '); 
      $decimal = strtok('(), '); 
     } 

     // Set definition 
     switch ($dbType) { 
      case 'set': 
       $definition['type'] = array('set'); 
       break; 
     } 

     return $definition; 
    } 
} 
+1

Homme très utile, merci. J'aurais pu juste rouler jusqu'à votre bureau, mais nahh, trop paresseux! – GordyD

Questions connexes