Memo

メモ > 技術 > CMS: ECCube > カスタマイズ: テーブルに項目を追加

カスタマイズ: テーブルに項目を追加
■ORMの機能で作成する例 ※実際の開発では常に「マイグレーションで作成する」を使うように統一するほうが良さそう ※ECCubeデフォルトのマイグレーションがあるので、先にマイグレーションを実行しておくといい 上記「ORMでテーブルを作成」の「テーブルの追加」で追加したテーブルに、 お問い合わせの送信日時(データの登録日時)を追加してみる (Entityのどの部分に追加しても、データベース上は最後に追加される) html\app\Customize\Entity\Contact.php に以下を追加
/** * @ORM\Column(type="datetimetz") */ private $create_date; public function setCreateDate($createDate) { $this->create_date = $createDate; return $this; } public function getCreateDate() { return $this->create_date; }
以下のようにして、作成される予定のSQLを確認する (あらかじめキャッシュをクリアしておかないと、実行しても 「[OK] Nothing to update - your database is already in sync with the current entity metadata.」 と表示される)
$ php bin/console cache:clear --no-warmup $ php bin/console eccube:schema:update --dump-sql gen -> /tmp/proxy_KTZb3ampuVeY/src/Eccube/Entity/Customer.php The following SQL statements will be executed: ALTER TABLE contact ADD create_date DATETIME NOT NULL COMMENT '(DC2Type:datetimetz)';
以下のようにして、実際にテーブルを更新する
$ php bin/console eccube:schema:update --force
html\app\Customize\Event.php を修正する
$Contact->setCreateDate(date('Y-m-d H:i:s'));
以下のコマンドでキャッシュを削除し、動作を確認する
$ php bin/console cache:clear --no-warmup
■マイグレーションで作成する例 ※ECCubeデフォルトのマイグレーションがあるので、先にマイグレーションを実行しておくといい ※上記 create_date をマイグレーションで追加するようにしたら、update_date の解説は削除しておくか 代わりに、ニュース管理を参考にCRUDを別途作ってみるか 上記「ORMでテーブルを作成」の「テーブルの追加」で追加したテーブルに、 さらにお問い合わせの編集日時(データの編集日時)を追加してみる (Entityとは異なり、作成されたSQLを調整することで任意の位置に追加できるみたい) html\app\Customize\Entity\Contact.php に以下を追加
/** * @ORM\Column(type="datetimetz") */ private $update_date; public function setUpdateDate($updateDate) { $this->update_date = $updateDate; return $this; } public function getUpdateDate() { return $this->update_date; }
Entityに基づいてmigrationファイルを自動生成 (あらかじめキャッシュをクリアしておかないと、実行しても「No changes detected in your mapping information.」と表示される)
$ php bin/console cache:clear --no-warmup $ php bin/console doctrine:migrations:diff Generated new migration class to "/var/www/html/app/DoctrineMigrations/Version20200817055148.php" from schema differences.
以下のファイルが作成された 必要に応じて、SQLの内容を変更する(「AFTER column_name」を追加したりなど) html\app\DoctrineMigrations\Version20200817055148.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 Version20200817055148 extends AbstractMigration { public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('ALTER TABLE contact ADD update_date DATETIME NOT NULL COMMENT \'(DC2Type:datetimetz)\''); } public function down(Schema $schema) : void { // this down() migration is auto-generated, please modify it to your needs $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('ALTER TABLE contact DROP update_date'); } }
実行されていない新しいバージョンのmigrationがあるかを確認 (ECCubeデフォルトのマイグレーションが未実行だと、その分も表示される)
$ php bin/console doctrine:migrations:status
マイグレーションを実行
$ php bin/console doctrine:migrations:migrate
テーブルに項目が追加される html\app\Customize\Event.php を修正する
$Contact->setUpdateDate(date('Y-m-d H:i:s'));
以下のコマンドでキャッシュを削除し、動作を確認する
$ php bin/console cache:clear --no-warmup

Advertisement