まったりのんびり、@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(・・・);