Добавьте столбец auto_increment в скрипт установки Magento без использования SQL - PullRequest
13 голосов
/ 17 марта 2011

Ранее я спрашивал, как ALTER TABLE в скрипте установки Magento без использования SQL . Там Иван дал отличный ответ, на который я до сих пор ссылаюсь даже сейчас.

Однако мне еще предстоит узнать, как использовать Varien_Db_Ddl_Table::addColumn() для указания столбца auto_increment. Я думаю, что это как-то связано с опцией под названием identity, но до сих пор не повезло.

Это вообще возможно или эта функция неполная?

Ответы [ 2 ]

16 голосов
/ 25 июня 2012

Можно создать такой столбец автоинкремента (по крайней мере, с Magento 1.6, может быть, даже раньше):

/** @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' );

Вместо «auto_increment» можно также использовать ключевое слово «identity».

12 голосов
/ 26 марта 2011

Я думаю, что это еще не реализовано.

Если вы посмотрите на источник addColumn, вы увидите, что он ищет опцию identity/auto_increment и устанавливает атрибут IDENTITY во внутреннем представлении столбца.

#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
);

Однако, если вы посмотрите на метод createTable объекта соединения

#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 и _getForeignKeysDefinition, используемые для создания фрагмента CREATE SQL. Ни один из этих методов не ссылается на identity или auto_increment, и при этом они не генерируют никакого sql, который бы создал автоинкремент.

Единственными возможными кандидатами в этом классе являются

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

, который используется для управления номером приращения для параметра, связанного с PDO (ничего общего с auto_increment).

Здесь также упоминается auto_increment здесь

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;
}

, но используется для обработки параметров, установленных в таблице . Этот auto_increment управляет параметрами таблицы AUTO_INCREMENT, которые можно использовать для управления тем, с какого целого числа начинается AUTO_INCREMENT.

...