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?
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é".
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.