メモ > 技術 > 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