カテゴリー
システム開発技術 マイグレーション

【マイグレーション】migration

まったりのんびり、@vVv_kenshi_vVvです!

EC-CUBE4の開発でよく使用するので、記事にしています。

注意事項

私の経験則で書いている事なので、すべて正しいというわけではございませんのでご了承くださいませ。

エスケープに注意

dtb_csvのカラムに「entity_name」があり「//」ダブルスラッシュで登録されています。

phpとsqlで2回エスケープされるみたいで「////////」8個記述しなければ「//」になりません。

ちなみに「/」で登録されても機能します。

プラグインなどは「/」で追加登録される事が多いみたいです。

マイグレーションで非推奨作業

何でもかんでもマイグレーションで、やらない事

  • テーブルは作成しない
  • テーブルは削除しない
  • テーブルのカラム「追加・削除」はしない
  • テーブルのカラム内容変更はしない

EC-CUBE4でカスタマイズするなら、上記の対応はスキーマの更新で可能です。

上記のようなマイグレーションを使用した後に、スキーマを更新したりプラグインをインストールや削除したりすると、Entityの方へ書き換えられて意図しないバグが発生する可能性があります。

スキーマの更新

対象のEntityの内容を変更してスキーマ更新コマンドで可能です。

スキーマの更新内容確認コマンド

Bash
php  bin/console doctrine:schema:update --dump-sql

スキーマ更新コマンド

php  bin/console doctrine:schema:update --dump-sql --force

migrationコマンド一覧

ついつい調べてしまう、忘れっぽいあなたに捧げる記事です。

先頭の「php」は、サーバーの設定によってログインユーザーでは権限で弾かれる可能性があるので「php」から実行しています。

マイグレーションを実行すると「migration_versions」へデータが登録されます。

データを削除し、マイグレーションを流し直しも可能です。

SQL
DELETE FROM migration_versions WHERE version = 'XXXX'

全ての実行されていないマイグレーション実行

Bash
php bin/console doctrine:migrations:migrate

マイグレーションファイルを指定して実行

Bash
php bin/console doctrine:migrations:execute 2021XXXXXXXXXX  --down 
php bin/console doctrine:migrations:execute 2021XXXXXXXXXX  --up

マイグレーションの状態確認

Bash
php bin/console doctrine:migrations:status

マイグレーションファイルを作成

Bash
php bin/console doctrine:migrations:generate

マイグレーション履歴の削除

Bash
php bin/console doctrine:migrations:version 2021XXXXXXXXXX --delete

マイグレーションファイル

コマンドで作成したマイグレーションファイル

PHP
<?php declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
 * Auto-generated Migration: Please modify to your needs!
 */
final class Version20220105152818 extends AbstractMigration
{
    public function up(Schema $schema) : void
    {
        // this up() migration is auto-generated, please modify it to your needs

    }

    public function down(Schema $schema) : void
    {
        // this down() migration is auto-generated, please modify it to your needs

    }
}

定数やDBからデータ取得も可能

サンプルコード:dtb_csvへ項目追加

PHP
final class Version2022XXXXXXXXXX extends AbstractMigration
{

    const ENTITY_NAME = 'Eccube\\\Entity\\Product';
    const FIELD_NAME = 'new_column';

    public function up(Schema $schema) : void
    {        
        $this->addSql("INSERT INTO dtb_csv (csv_type_id, creator_id, entity_name, field_name, reference_field_name, disp_name, sort_no, enabled, create_date, update_date, discriminator_type) VALUES ('1', null, 'Eccube////////Entity////////Product', 'new_column', 'new_column', '新規項目', '10', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'csv');");
    }

    public function down(Schema $schema) : void
    {
        $_ = function($s){return $s;};

        $targetId = $this->connection->fetchColumn("SELECT id FROM dtb_csv WHERE entity_name = '{$_(self::ENTITY_NAME)}' AND field_name = '{$_(self::FIELD_NAME)}'");

        if (!empty($targetId)) {
            $this->addSql("DELETE FROM dtb_csv WHERE id = $targetId;"); 
        }

   }
}

配列も取得可能

PHP
$targetId = $this->connection->fetchColumn(・・・);

$targetId = $this->connection->fetchArray(・・・);

作成者: kenshi

ゲーム大好きです。
ApexLegends, Arkやっています。
携帯販売員4年(240万)

プログラマー3年(350万)

フリーランスエンジニア1年(500万)