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