LoginSignup
5
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-09-18

概要

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

調べた結果

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

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

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

CustomBlueprintクラス作成

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クラス作成

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');
    }
}

参考サイト

5
4
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4