2

具体的には、MySQL にはそのフィールド タイプがないため、生の DB クエリは悪い考えのように思えます。pgsql にはデフォルトで大文字と小文字を区別しないテキスト フィールドがないため、この拡張機能を使用する必要がありましたが (もちろん、これは完全に機能します)、移行に関してジレンマに直面しています。

4

1 に答える 1

8

アップデート

この機能を実装するパッケージを作成しました。移行にメソッドを追加して、passthru()任意のフィールド タイプを作成できるようにします。この例では、パッケージをインストールしてサービス プロバイダーを追加した後$table->passthru('citext', 'name');、移行ファイルで行うだけです。パッケージは「laravel-nomad」と呼ばれ、githubpackagistにあります。


はい、これは可能です。いくつかのコア ファイルを拡張する必要がありますが、実行可能です。具体的には、新しい接続、スキーマ文法、設計図が必要になります。

まず、ディレクトリの下に新しいディレクトリを作成して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の値(またはドライバーに名前を付けたもの) を設定してください。driverpgsql-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');
    }
}
于 2015-05-25T23:48:14.470 に答える