Вопрос

Я создаю таблицу со ссылочным ключом catalog_product_entity, вот я немного путаюсь при конвертации Магенто 1.0 к Магенто 2.0.

Можете ли вы это прояснить?

В magento 1.0 я могу просто запустить приведенный ниже скрипт, который он выполнит, и создать таблицу, верно?

<?php

$installer = $this;
/* @var $installer Mage_Core_Model_Resource_Setup */

$installer->startSetup();

$installer->run("

-- DROP TABLE IF EXISTS `{$this->getTable('custom_info')}`;
CREATE TABLE `{$this->getTable('custom_info')}` (
  `id` INTEGER unsigned NOT NULL auto_increment,
  `product_id` INTEGER unsigned NOT NULL,
  `email` TEXT NOT NULL default '',
  `is_active` ENUM('0','1') NOT NULL DEFAULT '0',
  `date` DATETIME default '0000-00-00 00:00:00',  
  PRIMARY KEY  (`id`),
  KEY `FK_custom_PRODUCT_ID` (`product_id`),
  CONSTRAINT `FK_custom_PRODUCT_ID` FOREIGN KEY (`product_id`) REFERENCES `{$this->getTable('catalog_product_entity')}` (`entity_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

");

$installer->endSetup();

В Magento 2.0 я написал код, как показано ниже. Это правильная процедура или неправильная?

<?php

namespace Learning\Custom\Setup;

use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\DB\Ddl\Table;

class InstallSchema implements InstallSchemaInterface
{

    /**
 * Installs DB schema for a module
 *
 * @param SchemaSetupInterface $setup
 * @param ModuleContextInterface $context
 * @return void
 */
public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
    $installer = $setup;
    $installer->startSetup();

    $table = $installer->getConnection()->newTable($installer->getTable('outofstocksubscription_info'))
        ->addColumn(
            'id',
            Table::TYPE_INTEGER,
            10,
            ['identity' => true, 'nullable' => false, 'primary' => true],
            'Post ID'
        )
        ->addColumn(
            'product_id',
            Table::TYPE_INTEGER,
            10,
            ['unsigned' => true, 'nullable' => false, 'default' => '0'],
            'Product Id'
        )
        ->addColumn(
            'email',
            Table::TYPE_TEXT,
            null,
            ['nullable' => false,],
            'E Mail'
        )
        ->addColumn(
            'is_active',
            Table::TYPE_BOOLEAN,
            null,
            ['nullable' => false, 'default' => '0'],
            'Is Active'
        )
        ->addForeignKey(
            $installer->getFkName('outofstocksubscription_info', 'product_id', 'catalog_product_entity', 'entity_id'),
            'product_id',
            $installer->getTable('catalog_product_entity'),
            'entity_id',
            Table::ACTION_CASCADE
        )
        ->addColumn(
            'date',
            Table::TYPE_DATE,
            null,
            [],
            'Date'
        )
        ->setComment(
            'Out of Stock Subscription'
        );

    $installer->getConnection()->createTable($table);
    $installer->endSetup();
}

}

Если это неправильно, пожалуйста, поправьте меня.

Когда я выполнил команду: php bin/magento setup:upgrade пришла ошибка.

Ошибка

SQLSTATE[HY000]:Общая ошибка:1215 не может добавить ограничение иностранного ключа, запрос был:СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ custom_info ( id smallint NOT NULL auto_increment COMMENT 'Идентификатор сообщения' , product_id smallint UNSIGNED NOT NULL COMMENT 'Идентификатор продукта' , email текст NOT NULL COMMENT 'E Mail' , is_active bool NOT NULL по умолчанию '0' КОММЕНТАРИЙ 'Активен' , date Дата нулевой комментарий «дата», первичный ключ (id), Ограничение CUSTOM__INFO_ID_CATALOG_PRODUCT_ENTITY_ENTITY_IDВНЕШНИЙ КЛЮЧ (id) ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА catalog_product_entity (entity_id) На удалении Cascade) Комментарий = 'Custom Table' Engine = Innodb charset = utf8 collate = utf8_general_ci

Это было полезно?

Решение

Я думаю, вам нужно удалить параметры 6 в функции addForeignKey, потому что:

/**
 * Add Foreign Key to table
 *
 * @param string $fkName        the foreign key name
 * @param string $column        the foreign key column name
 * @param string $refTable      the reference table name
 * @param string $refColumn     the reference table column name
 * @param string $onDelete      the action on delete row
 * @return $this
 * @throws \Zend_Db_Exception
 * @SuppressWarnings(PHPMD.CyclomaticComplexity)
 */
public function addForeignKey($fkName, $column, $refTable, $refColumn, $onDelete = null)
{
    $upperName = strtoupper($fkName);

    // validate column name
    if (!isset($this->_columns[strtoupper($column)])) {
        throw new \Zend_Db_Exception('Undefined column "' . $column . '"');
    }

    switch ($onDelete) {
        case self::ACTION_CASCADE:
        case self::ACTION_RESTRICT:
        case self::ACTION_SET_DEFAULT:
        case self::ACTION_SET_NULL:
            break;
        default:
            $onDelete = self::ACTION_NO_ACTION;
    }

    $this->_foreignKeys[$upperName] = [
        'FK_NAME' => $fkName,
        'COLUMN_NAME' => $column,
        'REF_TABLE_NAME' => $refTable,
        'REF_COLUMN_NAME' => $refColumn,
        'ON_DELETE' => $onDelete
    ];

    return $this;
}

Другие советы

Для меня это выглядит нормально.Основное отличие сценария обновления или установки в magento2 заключается в том, что у вас нет нескольких сценариев.В Magento2 есть только один скрипт, который запускается несколько раз, поэтому вам придется управлять версиями самостоятельно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top