LaravelでPostgreSQLのmigrateにてコメントが登録されない

## 概要
PostgreSQLを使ってLaravelで開発しているとcomment()メソッドで指定しているのにテーブルにコメントが登録されていないことに気づき調べてみたことをメモしておく。

## 調べた結果
下記記事にも書かれているが、どうやらPostgreSQLの場合使えるメソッドが少ないようですね。
comment()メソッドについては、エラーにもならないので気づかなかったですが、どうやら非対応みたい...なんと(驚)

**Laravel のマイグレーションでテーブルカラムにコメントを設定する**
https://teratail.com/questions/91732

そこで、対応していないのであれば自分で作るしかないですね。

## CustomBlueprintクラス作成

```php:app/Migrates/CustomBlueprint.php
<?php

namespace App\Migrates;

use Illuminate\Database\Schema\Blueprint;

/**
 * Blueprintクラスの拡張
 *
 * @package App\Migrate
 */
class CustomBlueprint extends Blueprint
{
    /**
     * テーブルにコメントを追加する
     *
     * @param  string   $message
     * @return \Illuminate\Support\Fluent
     */
    public function commentTable($message)
    {
        return $this->addCommand(
            'commentTable', compact('message')
        );
    }

    /**
     * カラムにコメントを追加する
     *
     * @param  string   $column
     * @param  string   $message
     * @return \Illuminate\Support\Fluent
     */
    public function commentColumn($column, $message)
    {
        return $this->addCommand(
            'commentColumn', compact('column', 'message')
        );
    }
}
```

## CustomPgsqlGrammarクラス作成

```php:app/migrates/CustomPgsqlGrammar.php
<?php

namespace App\Migrates;

use Illuminate\Support\Fluent;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Schema\Grammars\PostgresGrammar;

/**
 * PostgresGrammarクラスを拡張
 *
 * @package App\Migrate
 */
class CustomPgsqlGrammar extends PostgresGrammar
{
    /**
     * コメントをテーブルに追加する
     *
     * @param  \Illuminate\Database\Schema\Blueprint  $blueprint
     * @param  \Illuminate\Support\Fluent  $command
     * @return string|null
     */
    public function compileCommentTable(Blueprint $blueprint, Fluent $command)
    {
        return sprintf('comment on table %s is %s',
            $this->wrapTable($blueprint),
            "'".$command->message."'"
        );
    }

    /**
     * コメントをカラムに追加する
     *
     * @param  \Illuminate\Database\Schema\Blueprint  $blueprint
     * @param  \Illuminate\Support\Fluent  $command
     * @return string|null
     */
    public function compileCommentColumn(Blueprint $blueprint, Fluent $command)
    {
        return sprintf('comment on column %s.%s is %s',
            $this->wrapTable($blueprint),
            $this->wrap($command->column),
            "'".$command->message."'"
        );
    }
}
```

## 使ってみる

```database/migrations/****_**_**_******_create_users_table.php
<?php

use Illuminate\Support\Facades\Schema,
    Illuminate\Database\Schema\Blueprint,
    Illuminate\Database\Migrations\Migration,
    App\Migrates\CustomBlueprint,
    App\Migrates\CustomPgsqlGrammar;

/**
 * 会員テーブルの作成
 */
class CreateUsersTable extends Migration
{
    /**
     * マイグレーション実行
     *
     * @access  public
     * @return  void
     */
    public function up()
    {
        DB::connection()->setSchemaGrammar(new CustomPgsqlGrammar());
        $schema = DB::connection()->getSchemaBuilder();

        $schema->blueprintResolver(function($table, $callback) {
            return new CustomBlueprint($table, $callback);
        });

        $schema->create('users', function (CustomBlueprint $table) {
            $table->bigincrements('id');
            $table->string('email');
            $table->password('password');
            $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
            $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP'));
            $table->softDeletes();

            // コメント定義
            $table->commentTable('会員');
            $table->commentColumn('email', 'メールアドレス');
            $table->commentColumn('password', 'パスワード');
            $table->commentColumn('created_at', '作成日時');
            $table->commentColumn('updated_at', '更新日時');
            $table->commentColumn('deleted_at', '削除日時');
        });
    }

    /**
     * 元に戻す
     *
     * @access  public
     * @return  void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}
```

## 参考サイト
- [Laravel のマイグレーションでテーブルカラムにコメントを設定する](https://teratail.com/questions/91732)
- [Laravel のマイグレーションで MySQL の COMMENT を扱う](http://takaya030.hatenablog.com/entry/20130926/1380209935)