Magento2 InstallSchema เพิ่มคอลัมน์ใหม่ลงในตารางที่มีอยู่


11

ฉันพยายามเพิ่มคอลัมน์ใหม่ลงในตารางที่มีอยู่ใน magento2

<?php

namespace Vendor\Module\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)
    {
        $installer = $setup;

        $installer->startSetup();

        $eavTable = $installer->getTable('eav_attribute');

        $columns = [
            'my_column' => [
                'type' => \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
                'length' => '1',
                'nullable' => false,
                'comment' => 'Description of my column',
            ],
        ];

        $connection = $installer->getConnection();
        foreach ($columns as $name => $definition) {
            $connection->addColumn($eavTable, $name, $definition);
        }

        $installer->endSetup();
    }
}

php bin / magento setup: upgrade

ไม่มีอะไรเกิดขึ้น

อัปเดต 1

หากฉันเข้าใจเป้าหมายอย่างชัดเจน InstallSchema จะดำเนินการเฉพาะเมื่อไม่มีค่าใด ๆ ในตารางการตั้งค่า หากโมดูลของคุณติดตั้งอยู่ในระบบแล้ว - คุณต้องทำการเปลี่ยนแปลงใด ๆ ใน UpgradeSchema นั่นเป็นเพราะไฟล์ของฉันไม่ได้ทำงาน เมื่อฉันเปลี่ยนชื่อมันเพื่ออัพเกรดและทำการเปลี่ยนแปลงที่จำเป็น - ทุกอย่างเริ่มทำงานอย่างถูกต้อง

คำตอบ:


7

อันดับแรกฉันสมมติว่าเมื่อคุณบอกว่าไม่มีอะไรเกิดขึ้นคุณหมายความว่าสคริปต์การตั้งค่าทำงานตามปกติ แต่ไม่มีข้อผิดพลาดเกิดขึ้นและไม่มีการเปลี่ยนแปลงใด ๆ กับฐานข้อมูลของคุณ หากนี่ไม่ใช่ข้อสันนิษฐานที่ถูกต้องโปรดแจ้งให้เราทราบ!

เมื่อฉันอัพเกรดสคีมาฉันไม่ได้ทำgetTable()ฉันคิดว่านั่นเป็นสิ่งที่ไม่จำเป็น

ฉันทดสอบสคริปต์ข้างต้นด้วยการเปลี่ยนแปลงนั้นและใช้งานได้ดังนั้นขั้นตอนการแก้ไขปัญหาสองขั้นตอนที่ฉันต้องทำคือ:

  1. ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มค่าsetup_versionในmodule.xml(หรือสคริปต์ของคุณจะไม่ทำงานเลย)
  2. เพิ่มข้อผิดพลาดที่ชัดเจนในสคริปต์อัปเกรดเพื่อดูว่ามันกำลังทำงานอยู่หรือไม่ ... หากมีข้อผิดพลาดและสคริปต์กำลังทำงานอยู่คุณจะได้รับข้อความแสดงข้อผิดพลาดเมื่อทำงาน setup:upgrade

ฉันหวังว่าจะช่วย!


1
ขอขอบคุณสำหรับการตอบสนองของคุณ. หากฉันเข้าใจเป้าหมายอย่างชัดเจน InstallSchema จะดำเนินการเฉพาะเมื่อไม่มีค่าใด ๆ ในตารางการตั้งค่า หากโมดูลของคุณติดตั้งอยู่ในระบบแล้ว - คุณต้องทำการเปลี่ยนแปลงใด ๆ ใน UpgradeSchema นั่นเป็นเพราะไฟล์ของฉันไม่ได้ทำงาน เมื่อฉันเปลี่ยนชื่อเป็นอัพเกรดและทำการเปลี่ยนแปลงที่จำเป็น - ทุกอย่างเริ่มทำงานอย่างถูกต้อง
zhartaunik

ฉันขอโทษที่ถูกต้อง 100% ขั้นตอนที่ 1 ควรลบรายการจากตาราง setup_module หรือเพื่อให้เป็นสคริปต์อัปเกรด ฉันดีใจที่มันทำงานให้คุณ!
Jer_

0

ลบรายการของโมดูลออกจากตาราง 'setup_module' จากนั้นรันคำสั่ง php bin / magento setup: upgrade มันจะทำงาน.


0

คุณสามารถสร้างสคริปต์และในโฟลเดอร์ dbscripts และเรียกใช้ไฟล์นี้จากเทอร์มินัลหรือเว็บเบราว์เซอร์

เช่นบันทึกไฟล์ในการpub/dbscripts/filename.phpวางรหัสนี้และเปลี่ยนแปลงตามความต้องการของคุณ

<?php
use Magento\Framework\App\Bootstrap;
require '../../app/bootstrap.php';
$bootstrap = Bootstrap::create(BP, $_SERVER);
$obj = $bootstrap->getObjectManager();
$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
error_reporting(E_ALL);
ini_set('display_errors', 1);
$resource = $objectManager->get('Magento\Framework\App\ResourceConnection');
$connection = $resource->getConnection();

$salesTable = $resource->getTableName('Table_Name');
$sql = "ALTER TABLE ".$salesTable. " ADD `Field_name` varchar(255)";
$connection->query($sql);

echo"Script Run Successfully";

เรียกใช้ไฟล์นี้จากเบราว์เซอร์เช่น

domain.name/pub/dbscripts/filename.php
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.