Magento 2 从自定义模块自动创建自定义 table
Magento 2 auto create custom table from custom module
我刚从 Magento 1.7 升级。我成功创建了模块、控制器、助手等
今天我尝试创建一个自定义模型 table。我希望自动创建 table。我做了以下步骤:
我创建了一个具有以下目录结构的模块:
<Ashutosh>
<Pandey>
<etc>
module.xml
<Model>
<Setup>
InstallSchema.php
以下是每个文件的内容:
InstallSchema.php
<?php
namespace Ashutosh\Pandey\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
{
public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
$installer = $setup;
$installer->startSetup();
// Get table
$tableName = $installer->getTable('ashutosh_friends');
// Check if the table already exists
if ($installer->getConnection()->isTableExists($tableName) != true) {
// Create tutorial_simplenews table
$table = $installer->getConnection()
->newTable($tableName)
->addColumn(
'id',
Table::TYPE_INTEGER,
null,
[
'identity' => true,
'unsigned' => true,
'nullable' => false,
'primary' => true
],
'ID'
)
->addColumn(
'name',
Table::TYPE_TEXT,
null,
['nullable' => false, 'default' => ''],
'Title'
)
->addColumn(
'friend_type',
Table::TYPE_TEXT,
null,
['nullable' => false, 'default' => ''],
'Summary'
)
->addColumn(
'created_at',
Table::TYPE_DATETIME,
null,
['nullable' => false],
'Created At'
)
->addColumn(
'status',
Table::TYPE_SMALLINT,
null,
['nullable' => false, 'default' => '0'],
'Status'
)
->setComment('Ashutosh Friends Table')
->setOption('type', 'InnoDB')
->setOption('charset', 'utf8');
$installer->getConnection()->createTable($table);
}
$installer->endSetup();
}
}
module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
<module name="Ashutosh_Pandey" setup_version="1.0.0" active="true"/>
</config>
然后在我的 magento2 目录的命令提示符下,我执行了命令:
php bin/magento setup:upgrade
命令成功运行,但未创建 table。
然后我也执行了命令:
php bin/magento setup:db-schema:upgrade
但还是没有任何反应。
注意:如果我在数据库中手动创建它,我可以读取 table 成功。
改变
if ($installer->getConnection()->isTableExists($tableName) != true) {
if (!$installer->getConnection()->isTableExists($tableName)) {
或
if ($installer->getConnection()->isTableExists($tableName) !== true) {
差别很小。参见 http://php.net/manual/en/language.operators.comparison.php
Magento 将 module.xml 中指定的模块版本与数据库 table setup_module 中的条目进行匹配。您可以尝试删除自定义模块的条目,该条目在使用 php bin/magento setup:upgrade
时应再次触发 magento 运行 安装脚本
select * from core_config_data;
delete from setup_module where module="<YOURMODULE>";
您需要使用 UpgradeSchema.php,因为该模块已经安装。
基本上与 InstallSchema.php 几乎相同,但函数名称重命名为 upgrade 并且实现 class UpgradeSchemaInterface 而不是 InstallSchemaInterface
然后 运行 magento setup:upgrade
就可以了
这是一个已回答的 magento 问题 here
我刚从 Magento 1.7 升级。我成功创建了模块、控制器、助手等
今天我尝试创建一个自定义模型 table。我希望自动创建 table。我做了以下步骤:
我创建了一个具有以下目录结构的模块:
<Ashutosh>
<Pandey>
<etc>
module.xml
<Model>
<Setup>
InstallSchema.php
以下是每个文件的内容:
InstallSchema.php
<?php
namespace Ashutosh\Pandey\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
{
public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
$installer = $setup;
$installer->startSetup();
// Get table
$tableName = $installer->getTable('ashutosh_friends');
// Check if the table already exists
if ($installer->getConnection()->isTableExists($tableName) != true) {
// Create tutorial_simplenews table
$table = $installer->getConnection()
->newTable($tableName)
->addColumn(
'id',
Table::TYPE_INTEGER,
null,
[
'identity' => true,
'unsigned' => true,
'nullable' => false,
'primary' => true
],
'ID'
)
->addColumn(
'name',
Table::TYPE_TEXT,
null,
['nullable' => false, 'default' => ''],
'Title'
)
->addColumn(
'friend_type',
Table::TYPE_TEXT,
null,
['nullable' => false, 'default' => ''],
'Summary'
)
->addColumn(
'created_at',
Table::TYPE_DATETIME,
null,
['nullable' => false],
'Created At'
)
->addColumn(
'status',
Table::TYPE_SMALLINT,
null,
['nullable' => false, 'default' => '0'],
'Status'
)
->setComment('Ashutosh Friends Table')
->setOption('type', 'InnoDB')
->setOption('charset', 'utf8');
$installer->getConnection()->createTable($table);
}
$installer->endSetup();
}
}
module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
<module name="Ashutosh_Pandey" setup_version="1.0.0" active="true"/>
</config>
然后在我的 magento2 目录的命令提示符下,我执行了命令:
php bin/magento setup:upgrade
命令成功运行,但未创建 table。 然后我也执行了命令:
php bin/magento setup:db-schema:upgrade
但还是没有任何反应。
注意:如果我在数据库中手动创建它,我可以读取 table 成功。
改变
if ($installer->getConnection()->isTableExists($tableName) != true) {
if (!$installer->getConnection()->isTableExists($tableName)) {
或
if ($installer->getConnection()->isTableExists($tableName) !== true) {
差别很小。参见 http://php.net/manual/en/language.operators.comparison.php
Magento 将 module.xml 中指定的模块版本与数据库 table setup_module 中的条目进行匹配。您可以尝试删除自定义模块的条目,该条目在使用 php bin/magento setup:upgrade
时应再次触发 magento 运行 安装脚本select * from core_config_data;
delete from setup_module where module="<YOURMODULE>";
您需要使用 UpgradeSchema.php,因为该模块已经安装。
基本上与 InstallSchema.php 几乎相同,但函数名称重命名为 upgrade 并且实现 class UpgradeSchemaInterface 而不是 InstallSchemaInterface
然后 运行 magento setup:upgrade
就可以了
这是一个已回答的 magento 问题 here