Ajouter une colonne d'incrément automatique dans le script de configuration de Magento sans utiliser SQL

précédemment j'ai demandé comment modifier la TABLE dans le script de configuration de Magento sans utiliser SQL. Il y a, Ivan a donné une excellente réponse à laquelle je me réfère encore aujourd'hui.

Toutefois, j'ai encore à découvrir comment l'utiliser Varien_Db_Ddl_Table::addColumn() pour spécifier un auto_increment colonne. Je pense qu'il a quelque chose à faire avec l'option identity mais jusqu'à présent, n'ont eu aucune chance.

est-ce possible ou cette fonctionnalité est-elle incomplète?

13
demandé sur Community 2011-03-17 19:00:14

2 réponses

on peut créer une colonne d'auto-engagement comme celle-ci (au moins depuis Magento 1.6, peut-être même plus tôt):

/** @var $table Varien_Db_Ddl_Table */
$table->addColumn( 'id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
    'auto_increment' => true,
    'unsigned' => true,
    'nullable' => false,
    'primary' => true,
), 'ID' );

au Lieu de "auto_increment", on peut aussi utiliser le mot-clé "identité".

14
répondu feeela 2012-12-08 10:49:55

je pense que c'est quelque chose qui n'a pas encore été mis en oeuvre.

Si vous regardez le code source addColumn, vous pouvez le voir, il recherche un identity/auto_increment option et définit un IDENTITY attribut sur la représentation de la colonne interne.

#File: lib/Varien/Db/Ddl/Table.php
if (!empty($options['identity']) || !empty($options['auto_increment'])) {
    $identity = true;
}

$upperName = strtoupper($name);
$this->_columns[$upperName] = array(
    'COLUMN_NAME'       => $name,
    'COLUMN_TYPE'       => $type,
    'COLUMN_POSITION'   => $position,
    'DATA_TYPE'         => $type,
    'DEFAULT'           => $default,
    'NULLABLE'          => $nullable,
    'LENGTH'            => $length,
    'SCALE'             => $scale,
    'PRECISION'         => $precision,
    'UNSIGNED'          => $unsigned,
    'PRIMARY'           => $primary,
    'PRIMARY_POSITION'  => $primaryPosition,
    'IDENTITY'          => $identity
);

cependant, si vous regardez createTable méthode sur l'objet de connexion

#File: lib/Varien/Db/Adapter/Pdo/Mysql.php
public function createTable(Varien_Db_Ddl_Table $table)
{
    $sqlFragment    = array_merge(
        $this->_getColumnsDefinition($table),
        $this->_getIndexesDefinition($table),
        $this->_getForeignKeysDefinition($table)
    );
    $tableOptions   = $this->_getOptionsDefination($table);

    $sql = sprintf("CREATE TABLE %s (\n%s\n) %s",
        $this->quoteIdentifier($table->getName()),
        implode(",\n", $sqlFragment),
        implode(" ", $tableOptions));

    return $this->query($sql);
}

_getColumnsDefinition,_getIndexesDefinition et _getForeignKeysDefinition sont utilisés pour créer un CREATE SQL fragment. Aucune de ces méthodes ne fait référence identity ou auto_increment, ils ne semblent pas non plus générer de sql qui créerait un incrément automatique.

Les seuls candidats possibles dans cette classe sont

/**
 * Autoincrement for bind value
 *
 * @var int
 */
protected $_bindIncrement       = 0;

qui est utilisé pour contrôler le nombre d'incréments pour un paramètre lié à AOP (rien à voir avec auto_increment).

il y a aussi une mention de auto_increment ici

protected function _getOptionsDefination(Varien_Db_Ddl_Table $table)
{
    $definition = array();
    $tableProps = array(
        'type'              => 'ENGINE=%s',
        'checksum'          => 'CHECKSUM=%d',
        'auto_increment'    => 'AUTO_INCREMENT=%d',
        'avg_row_length'    => 'AVG_ROW_LENGTH=%d',
        'comment'           => 'COMMENT=\'%s\'',
        'max_rows'          => 'MAX_ROWS=%d',
        'min_rows'          => 'MIN_ROWS=%d',
        'delay_key_write'   => 'DELAY_KEY_WRITE=%d',
        'row_format'        => 'row_format=%s',
        'charset'           => 'charset=%s',
        'collate'           => 'COLLATE=%s'
    );
    foreach ($tableProps as $key => $mask) {
        $v = $table->getOption($key);
        if (!is_null($v)) {
            $definition[] = sprintf($mask, $v);
        }
    }

    return $definition;
}

mais ceci est utilisé pour traiter les options définies sur le table. Ce auto_increment contrôle l' la table AUTO_INCREMENT options, qui peuvent être utilisés pour contrôler un entier AUTO_INCREMENT commence.

11
répondu Alan Storm 2011-03-26 18:28:44