Схема установки Magento 2:Верно ли мое предположение?
-
13-12-2019 - |
Вопрос
Я создаю таблицу со ссылочным ключом 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 'Идентификатор продукта' ,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 есть только один скрипт, который запускается несколько раз, поэтому вам придется управлять версиями самостоятельно.