ECCUBE4

既存テーブルの変更

EC-CUBE4ではデフォルトでEC機能に必要な様々なテーブルが用意されていています。

トレイトファイルの作成とプロクシー機能を使って、既存のテーブルを変更する事ができます。

会員情報を管理している、dtb_customerにFAX番号を管理するカラムを追加してみましょう。

Traitファイルの生成

それでは、app/Customize/Entityファイルに以下の内容のファイルを作成しましょう。

<?php

namespace Customize\Entity;

use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation\EntityExtension;

/**
 * @EntityExtension("Eccube\Entity\Customer")
 */
trait CustomerTrait
{
    /**
     * @ORM\Column(name="fax_number", type="string", length=14, nullable=true)
     */
    public $fax_number;

    /**
     * Get fax_number
     *
     * @return fax_number
     */
    public function getFaxNumber()
    {
        return $this->fax_number;
    }

    /**
     * Set fax_number
     *
     * @return this
     */
    public function setFaxNumber($fax_number)
    {
        $this->fax_number = $fax_number;
    }
}
CustomerTraitファイルの解説

9行目:どのテーブル(エンティティ)を変更するか書きます。

14行目:カラム名、型、その他を設定

16行目:変数名を設定

18〜36行目:ゲッターとセッターを書きます。

Proxyファイルの生成

次のコマンドラインを打ち込んでProxyファイルを生成しましょう。

$ bin/console eccube:generate:proxies
gen -> /Users/******/eccube4_sources/ec-cube/app/proxy/entity/src/Eccube/Entity/Customer.php

生成されたファイルの中身を確認しましょう。

<?php

/*
 * This file is part of EC-CUBE
 *
 * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
 *
 * http://www.ec-cube.co.jp/
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Eccube\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Mapping\ClassMetadata;


    /**
     * Customer
     *
     * @ORM\Table(name="dtb_customer", uniqueConstraints={@ORM\UniqueConstraint(name="secret_key", columns={"secret_key"})}, indexes={@ORM\Index(name="dtb_customer_buy_times_idx", columns={"buy_times"}), @ORM\Index(name="dtb_customer_buy_total_idx", columns={"buy_total"}), @ORM\Index(name="dtb_customer_create_date_idx", columns={"create_date"}), @ORM\Index(name="dtb_customer_update_date_idx", columns={"update_date"}), @ORM\Index(name="dtb_customer_last_buy_date_idx", columns={"last_buy_date"}), @ORM\Index(name="dtb_customer_email_idx", columns={"email"})})
     * @ORM\InheritanceType("SINGLE_TABLE")
     * @ORM\DiscriminatorColumn(name="discriminator_type", type="string", length=255)
     * @ORM\HasLifecycleCallbacks()
     * @ORM\Entity(repositoryClass="Eccube\Repository\CustomerRepository")
     */
    class Customer extends \Eccube\Entity\AbstractEntity implements UserInterface
    {
    use \Customize\Entity\CustomerTrait;

        /**
         * @var int
CustomerTraitファイルの解説

33行目:先ほど作成したTraitファイルをuseする事で、CustomerにFAXの管理カラムを追加しています。

テーブルへの反映

テーブルへの反映を行います。

$ bin/console d:s:u --dump-sql --force

 The following SQL statements will be executed:

     ALTER TABLE dtb_customer ADD fax_number VARCHAR(14) DEFAULT NULL;

 Updating database schema...

     1 query was executed

                                                                                                                        
 [OK] Database schema updated successfully!   

OKがでていれば、実行完了です!