LoginSignup
2
3

More than 5 years have passed since last update.

LaravelでPostgreSQLの配列型を使いたい

Last updated at Posted at 2017-09-18

概要

PostgreSQLで部分インデックスを使いたかった(論理削除で...)のでマイグレーションを
カスタマイズするために調べた内容をメモとして残します。

CustomBlueprintクラス作成

App/Migrates/CustomBlueprint.php
<?php

namespace App\Migrates;

use Illuminate\Database\Schema\Blueprint;

/**
 * Blueprintクラスの拡張
 *
 * @package App\Migrate
 */
class CustomBlueprint extends Blueprint
{
    /**
     * テキストの配列型を作成する
     *
     * @param  string  $column
     * @return \Illuminate\Support\Fluent
     */
    public function textArray($column)
    {
        return $this->addColumn('textArray', $column);
    }
}

PostgresGrammarクラス作成

App/Migrates/PostgresGrammar.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\Support\Fluent  $column
     * @return string
     */
    protected function typeTextArray(Fluent $column)
    {
        return 'text[]';
    }
}

使ってみる

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->textArray('type');

            $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
            $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP'));
        });
    }

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

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
2
3