【EC-CUBE4系】Entityの更新をマスターする

# エンティティーを更新する一番楽な方法
皆さんEC-CUBEでカラム追加したりする際、エンティティーを更新すると思いますがどのように行っておりますか？
個人的に一番楽な方法は以下のように既存のエンティティファイルを直で編集する方法だと思います。

```Sample.php
<?php

namespace Eccube\Entity;

use Doctrine\ORM\Mapping as ORM;

if (!class_exists('\Customize\Entity\Sample')) {
    /**
     * Sample
     *
     * @ORM\Table(name="dtb_sample")
     * @ORM\Entity(repositoryClass="Eccube\Repository\SampleRepository")
     */
    class TestTable extends \Eccube\Entity\AbstractEntity
    {
        /**
         * id
         *
         * @var int
         *
         * @ORM\Column(name="id", type="integer", options={"unsigned":true)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
        
        /**
         * 新しいカラム
         *
         * @var string|null
         *
         * @ORM\Column(name="new_column", type="string", length=255, nullable=true)
         */
        private $new_column;
```
新しく追加したいプロパティーを追記していきます。


```Sample.php
    /**
     * Set newColumn.
     *
     * @param string|null $new_column
     *
     * @return Sample
     */
    public function setNewColumn($new_column)
    {
        $this->new_column = $new_column;

        return $this;
    }

    /**
     * Get newColumn.
     *
     * @return string|null
     */
    public function getNewColumn()
    {
        return $this->new_column;
    }
```
あとはセッターとゲッターを用意すればOK

このあとdiffコマンドを打てば差分を取ったmigrationファイルを速攻で作れるので
migrationファイルを残さないといけないプロジェクトなんかでも楽かも。
```
php bin/console doctrine:migrations:diff
```

# 上のやり方が通用しない時
そもそもこのやり方が公式ではないと思うので個人の判断でプロジェクトに合わせて行ってください。
上のやり方が通用しない時があります。
追記してもdiffコマンドで差分を検知しませんし、無理やりマイグレーションしてもセッターやゲッターも使えません。

**それはTraitファイルが存在するときです。**
TraitファイルはもともとあるEntityファイルの上書きです。
Traitファイルは以下のような場所にあります。

- app/Customize/Entitiy配下
- app/Plugin/プラグイン名/Entity配下

Entityファイルに以下のようにuse Traitの記載がある場合Traitを参照しているので分かります。
```Sample.php
<?php

namespace Eccube\Entity;

use Doctrine\ORM\Mapping as ORM;

if (!class_exists('\Customize\Entity\Sample')) {
    /**
     * Sample
     *
     * @ORM\Table(name="dtb_sample")
     * @ORM\Entity(repositoryClass="Eccube\Repository\SampleRepository")
     */
    class TestTable extends \Eccube\Entity\AbstractEntity
    {
        //これ
        use SampleTrait;      

        /**
         * id
         *
         * @var int
         *
         * @ORM\Column(name="id", type="integer", options={"unsigned":true)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
        
        以下省略
```
この場合のEntityファイルはTraitファイルの方を更新します。

ではどうやって更新するのか・・・

# 何やってるのかよく分からないプロキシ生成
ここで登場するのがProxyクラスです。
EC-CUBEの公式ドキュメントで一度は見たことあるこのコマンド。
そして何も説明がありません・・・（怒）
```
bin/console eccube:generate:proxies
```


実は・・・
**プロキシファイルは元々あるエンティティとTraitを紐づける役割をしています。**
（なにそれめっちゃ重要じゃん）

このコマンドでプロキシファイルを生成することによって先ほどのもともとのEntityファイルに
`use Trait` の記載が勝手に付く訳なんですね。

<INS>無論Customize配下にTraitを新しく作成したりしたらこのコマンドを打ってプロキシを再生成しないとダメです。</INS>
私の場合プラグインが既にTraitファイルを作っていたためentityファイルを直で編集できずハマった経験があります。

ここまで理解でき、進めればdiffコマンドでmigrationファイルもちゃんと差分を出してくれます。

ありがたかった参考記事

https://eccube.hatenablog.com/entry/2019/12/06/EC-CUBE4%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AB%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%AA%E3%81%84%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E7%94%9F%E6%88%90%E3%81%AE%E6%8C%99