具体的には、MySQL にはそのフィールド タイプがないため、生の DB クエリは悪い考えのように思えます。pgsql にはデフォルトで大文字と小文字を区別しないテキスト フィールドがないため、この拡張機能を使用する必要がありましたが (もちろん、これは完全に機能します)、移行に関してジレンマに直面しています。
1 に答える
アップデート
この機能を実装するパッケージを作成しました。移行にメソッドを追加して、passthru()
任意のフィールド タイプを作成できるようにします。この例では、パッケージをインストールしてサービス プロバイダーを追加した後$table->passthru('citext', 'name');
、移行ファイルで行うだけです。パッケージは「laravel-nomad」と呼ばれ、githubとpackagistにあります。
はい、これは可能です。いくつかのコア ファイルを拡張する必要がありますが、実行可能です。具体的には、新しい接続、スキーマ文法、設計図が必要になります。
まず、ディレクトリの下に新しいディレクトリを作成してapp
、カスタム ファイルを保持します。たとえば、app/Extension
. このディレクトリに配置されたファイルは、コア Illuminate ファイルを拡張するため、この新しいディレクトリの下に Illuminate フォルダ構造を複製します。
設計図
移行に使用できる新しい方法を追加するには、ブループリントを更新する必要があります。コア ブループリント クラスを拡張するカスタム ブループリント クラスを作成します。このカスタム ブループリント クラスには新しいメソッドが含まれます (例: ciText()
)。
アプリ/拡張機能/データベース/スキーマ/PostgresCustomBlueprint.php
<?php namespace App\Extension\Database\Schema;
use Illuminate\Database\Schema\Blueprint;
class PostgresCustomBlueprint extends Blueprint {
/**
* Create a new case-insensitive text column on the table.
*
* @param string $column
* @return \Illuminate\Support\Fluent
*/
public function ciText($column)
{
return $this->addColumn('ciText', $column);
}
}
スキーマ文法
ブループリントを更新してciText()
メソッドを許可したら、フィールドを処理できるようにスキーマの文法を更新する必要がありciText
ます。コア PostgresGrammar スキーマ文法クラスを拡張するカスタム スキーマ文法クラスを作成します。このカスタム スキーマ文法には、BlueprintciText
列をcitext
フィールドに変換するメソッドがあります。
アプリ/拡張機能/データベース/スキーマ/文法/PostgresCustomGrammar.php
<?php namespace App\Extension\Database\Schema\Grammars;
use Illuminate\Database\Schema\Grammars\PostgresGrammar;
use Illuminate\Support\Fluent;
class PostgresCustomGrammar extends PostgresGrammar {
/**
* Create the column definition for a citext type.
*
* @param \Illuminate\Support\Fluent $column
* @return string
*/
protected function typeCiText(Fluent $column)
{
return 'citext';
}
}
繋がり
フィールドを使用できるようにするカスタム ブループリントとカスタム スキーマ文法ができcitext
たので、これらの新しいカスタム クラスを使用するカスタム接続を作成する必要があります。このカスタム Connection クラスは、コア PostgresConnection クラスを拡張して、カスタム スキーマ文法とカスタム ブループリントを使用するために必要なメソッドをオーバーライドします。
アプリ/拡張機能/データベース/PostgresCustomConnection.php
<?php namespace App\Extension\Database;
use Illuminate\Database\PostgresConnection;
use App\Extension\Database\Schema\Grammars\PostgresCustomGrammar as SchemaGrammar;
use App\Extension\Database\Schema\PostgresCustomBlueprint;
class PostgresCustomConnection extends PostgresConnection {
/**
* Get the default schema grammar instance.
*
* @return \App\Extension\Database\Schema\Grammars\PostgresCustomGrammar
*/
protected function getDefaultSchemaGrammar()
{
return $this->withTablePrefix(new SchemaGrammar);
}
/**
* Get a schema builder instance for the connection.
*
* @return \Illuminate\Database\Schema\Builder
*/
public function getSchemaBuilder()
{
$parentBuilder = parent::getSchemaBuilder();
// add a blueprint resolver closure that returns the custom blueprint
$parentBuilder->blueprintResolver(function($table, $callback) {
return new PostgresCustomBlueprint($table, $callback);
});
return $parentBuilder;
}
}
サービスプロバイダー
カスタム接続がセットアップされたので、Laravel にそれを使用するように指示する必要があります。ビルトインpgsql
ドライバをオーバーライドしてクラスを使用するか、新しい接続用にPostgresCustomConnection
新しいドライバ名 (例: ) を作成できます。pgsql-custom
組み込みのドライバーをオーバーライドするだけの場合は、ファイルのメソッドにpgsql
次の行を追加する必要があります。register()
app/Providers/AppServiceProvider.php
$this->app->bind('db.connection.pgsql', 'App\Extension\Database\PostgresCustomConnection');
新しいドライバー名 (例: ) を作成する場合は、ファイルのメソッドにpgsql-custom
次の 2 行を追加する必要があります。register()
app/Providers/AppServiceProvider.php
$this->app->bind('db.connector.pgsql-custom', 'Illuminate\Database\Connectors\PostgresConnector');
$this->app->bind('db.connection.pgsql-custom', 'App\Extension\Database\PostgresCustomConnection');
データベース構成
新しいドライバー名を作成する場合は、必ずファイルを更新して、接続のキーconfig/database.php
の値(またはドライバーに名前を付けたもの) を設定してください。driver
pgsql-custom
職人
最後に、artisan コマンドを実行して、すべてのクラスが見つかることを確認し、キャッシュされた (コンパイルされた) バージョンの を更新しますapp/Providers/AppServiceProvider
。
composer dump-autoload
php artisan clear-compiled
php artisan optimize
移行
ciText()
これで、移行内でメソッドを使用できるようになり、citext
フィールドが作成されます。
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function(Blueprint $table)
{
$table->engine = 'InnoDB';
$table->increments('id');
$table->timestamps();
$table->ciText('name');
$table->ciText('email')->unique();
$table->string('password', 60);
$table->rememberToken();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('users');
}
}