PHPオフィシャル Dockerコンテナに redis exension を追加するメモ

概要

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

調べた結果

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

Laravel のマイグレーションでテーブルカラムにコメントを設定する

前提・実現したいことLaravel 5.5 (PHP 7.1) + PostgreSQL 9.5 を使用。マイグレーションでテーブルカラムにコメントを設定したい。 発生している問

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

CustomBlueprintクラス作成

app/Migrates/CustomBlueprint.php
<?php

namespace AppMigrates;

use IlluminateDatabaseSchemaBlueprint;

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

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

CustomPgsqlGrammarクラス作成

app/migrates/CustomPgsqlGrammar.php
<?php

namespace AppMigrates;

use IlluminateSupportFluent;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseSchemaGrammarsPostgresGrammar;

/**
 * PostgresGrammarクラスを拡張
 *
 * @package AppMigrate
 */
class CustomPgsqlGrammar extends PostgresGrammar
{
    /**
     * コメントをテーブルに追加する
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $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  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $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 IlluminateSupportFacadesSchema,
    IlluminateDatabaseSchemaBlueprint,
    IlluminateDatabaseMigrationsMigration,
    AppMigratesCustomBlueprint,
    AppMigratesCustomPgsqlGrammar;

/**
 * 会員テーブルの作成
 */
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');
    }
}
[紹介元] PHPタグが付けられた新着投稿 – Qiita PHPオフィシャル Dockerコンテナに redis exension を追加するメモ

関連記事