Magento2開發教程 - 如何向數據庫添加新表


Magento 2具有特殊的機制,允許你創建數據庫表,修改現有的,甚至添加一些數據到他們(如安裝數據,已被添加在模塊安裝)。 這種機制允許這些變化可以在不同的設備之間傳輸。

關鍵的概念是,而不是做你能做的一次又一次重新安裝系統時,手動SQL操作,開發人員創建一個安裝(或升級)腳本包含數據。 每次安裝模塊時,腳本將被執行。

Magento 2有四種類型的腳本:installschema,installdata,upgradeschema和upgradedata。 安裝腳本只執行一次,而升級腳本每次執行模塊版本被更改時執行。

要查看所有四種腳本類型,我們將完成以下問候頁任務:

  • 創建 greeting_message 表和列greeting_id 和 message.
  • 添加兩個記錄: “Happy New Year”, “Happy Holidays”.
  • 接下來,修改表添加另一個字段,“season”,我們添加了記錄“Happy Thanksgiving”和“Fall”。
  • 更新第一和第二記錄的類型。

我們需要采取的步驟來完成這些任務:

  1. 創建新模塊.
  2. 創建 InstallSchema 腳本.
  3. 創建 InstallData 腳本.
  4. 添加一個新模塊並驗證創建數據表。
  5. 創建 UpgradeSchema 腳本.
  6. 創建 UpgradeData 腳本.
  7. 運行升級腳本並驗證表已更改。

讓我們走過每一步。

1:創建新模塊

創建新模塊 Learning_GreetingMessage.

進入app/code 文件夾和創建文件夾 LearningLearning/GreetingMessage:

$ cd <magento2_root>/app/code
$ mkdir Learning
$ mkdir Learning/GreetingMessage

現在創建兩個文件:

Learning/GreetingMessage/registration.php

/** * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Learning_GreetingMessage', __DIR__ );


Learning/GreetingMessage/etc/module.xml

<?xml version="1.0"?> <!-- /** * Copyright © 2016 Magento. All rights reserved. * * See COPYING.txt for license details. --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Learning_GreetingMessage" setup_version="0.0.1"> </module> </config>

2: 創建 InstallSchema 腳本

創建一個InstallSchema腳本,在 app/code/Learning/GreetingMessage 文件夾 和創建一個Setup 文件夾。

$ cd <magento2_root>/app/code/Learning/GreetingMessage
$ mkdir Setup

創建 Setup/InstallSchema.php文件

/** * Copyright © 2016 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace Learning\GreetingMessage\Setup; use Magento\Framework\Setup\InstallSchemaInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\SchemaSetupInterface; /**  * @codeCoverageIgnore  */ class InstallSchema implements InstallSchemaInterface { /**  * {@inheritdoc}  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)  */ public function install(SchemaSetupInterface $setup, ModuleContextInterface $context) { /**  * Create table 'greeting_message'  */ $table = $setup->getConnection() ->newTable($setup->getTable('greeting_message')) ->addColumn( 'greeting_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true], 'Greeting ID' ) ->addColumn( 'message', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 255, ['nullable' => false, 'default' => ''], 'Message' )->setComment("Greeting Message table"); $setup->getConnection()->createTable($table); } }

讓我們花點時間看看代碼。

installschema文件都是非常典型的。 主代碼位於install() 方法,有一個 $setup 參數。 這是一個關鍵參數,因為它提供了訪問 Connection() 允許數據庫操作的。

連接是 Magento\Framework\DB\Adapter\Pdo\Mysql 一個實例類。

Magento使用DDL(數據定義語言)來操縱數據庫。 你可以在Magento 2核心代碼找到DDL的各種例子。

3:創建 InstallData 腳本

創建 Setup/InstallData.php 文件:

/**  * Copyright © 2016 Magento. All rights reserved.  * See COPYING.txt for license details.  */ namespace Learning\GreetingMessage\Setup; use Magento\Framework\Setup\InstallDataInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\ModuleDataSetupInterface; /**  * @codeCoverageIgnore  */ class InstallData implements InstallDataInterface { /**  * {@inheritdoc}  * @SuppressWarnings(PHPMD.CyclomaticComplexity)  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)  * @SuppressWarnings(PHPMD.NPathComplexity)  */ public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context) { /**  * Install messages  */ $data = [ ['message' => 'Happy New Year'], ['message' => 'Marry Christams'] ]; foreach ($data as $bind) { $setup->getConnection() ->insertForce($setup->getTable('greeting_message'), $bind); } } }

4: 添加新模塊並驗證創建數據表

現在是運行安裝腳本並驗證帶有初始數據的表的時候了,所以我們將運行setup:upgrade 腳本。

$ cd <magento2_root>
$ php bin/magento setup:upgrade

你應該看到一長串包含的模塊Learning_GreetingMessage.

現在讓我們連接數據庫: mysql -u<user> -p<password> <database>

SHOW TABLES LIKE “%greeting%”

+------------------------------------+
| Tables_in_magento_210 (%greeting%) |
+------------------------------------+
| greeting_message                   |
+------------------------------------+

SELECT * FROM greeting_message;

+-------------+-----------------+
| greeting_id | message         |
+-------------+-----------------+
| 1           | Happy New Year  |
| 2           | Happy Holidays  |
+-------------+-----------------+

檢查表和數據是否存在

這是怎么工作的? 當你創建新模塊運行 bin/magento setup:upgrade 腳本,Magento的檢查代碼,看有沒有安裝模塊。 如果它找到任何,它檢查是否有任何安裝腳本,如果是的話,運行它們。 在那之后,Magento更新表格setup_module提出關於模塊的版本信息有:

SELECT * FROM setup_module WHERE module='Learning_GreetingMessage';

+--------------------------+----------------+--------------+
| module                   | schema_version | data_version |
+--------------------------+----------------+--------------+
| Learning_GreetingMessage | 0.0.1          | 0.0.1        |
+--------------------------+----------------+--------------+

5: 創建 UpgradeSchema 腳本

要查看升級腳本如何工作,我們將向數據庫添加一些數據。

首先,改變版本在 etc/module.xml 文件為0.0.2:

<module name="Learning_GreetingMessage" setup_version="0.0.2">


創建文件 Setup/UpgradeSchema.php:

/**  * Copyright © 2016 Magento. All rights reserved.  * See COPYING.txt for license details.  */ namespace Learning\GreetingMessage\Setup; use Magento\Framework\Setup\UpgradeSchemaInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\SchemaSetupInterface; /**  * Upgrade the Catalog module DB scheme  */ class UpgradeSchema implements UpgradeSchemaInterface { /**  * {@inheritdoc}  */ public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context) { $setup->startSetup(); if (version_compare($context->getVersion(), '0.0.2', '<')) { $setup->getConnection()->addColumn( $setup->getTable('greeting_message'), 'season', [ 'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 'length' => 16, 'nullable' => false, 'default' => '', 'comment' => 'Season' ] ); } $setup->endSetup(); } }

注意“version_compare”線。 如前所述,該upgradescript將每一次的版本中執行module.xml。 因此,我們只希望當前的版本升級腳本執行,而不是以前的升級。 這就是為什么我們把升級納入“如果”條款。

6: 創建 UpgradeData 腳本

創建文件 Setup/UpgradeData.php:

/**  * Copyright © 2016 Magento. All rights reserved.  * See COPYING.txt for license details.  */ namespace Learning\GreetingMessage\Setup; use Magento\Framework\Setup\UpgradeDataInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\ModuleDataSetupInterface; /**  * Upgrade Data script  */ class UpgradeData implements UpgradeDataInterface { /**  * {@inheritdoc}  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)  */ public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context) { $setup->startSetup(); if ($context->getVersion() && version_compare($context->getVersion(), '0.0.2') < 0 ) { $table = $setup->getTable('greeting_message'); $setup->getConnection() ->insertForce($table, ['message' => 'Happy Thanksgiving, 'season' => 'fall']);  $setup->getConnection()  ->update($table, ['season' => 'winter'], 'greeting_id IN (1,2)'); } $setup->endSetup(); } }

7: 運行升級腳本並驗證表已更改

我們會再次運行setupupgrade腳本:

$ cd <magento2_root>
$ php bin/magento setup:upgrade

現在,我們可以連接到數據庫,並驗證我們的變化:

select * from greeting_message;

+-------------+--------------------+--------+
| greeting_id | message            | season |
+-------------+--------------------+--------+
| 1           | Happy New Year     | winter |
| 2           | Happy Holidays     | winter |
| 3           | Happy Thanksgiving | fall   |
+-------------+--------------------+--------+


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM