Php 有没有办法使用Laravel 5迁移创建citext字段?

Php 有没有办法使用Laravel 5迁移创建citext字段?,php,postgresql,laravel,laravel-5,laravel-migrations,Php,Postgresql,Laravel,Laravel 5,Laravel Migrations,具体来说,由于MySQL没有这种字段类型,所以原始DB查询似乎不是一个好主意。由于默认情况下pgsql缺少不区分大小写的文本字段,我们不得不使用这个扩展(当然,它工作得很好),但现在在迁移过程中面临着两难的境地。Update 我已经创建了一个实现此功能的包。它向迁移中添加了一个passthru()方法,这样您就可以创建任何想要的字段类型。在本例中,在安装包并添加服务提供者之后,只需执行$table->passthru('citext','name')在迁移文件中。该软件包名为“laravel n

具体来说,由于MySQL没有这种字段类型,所以原始DB查询似乎不是一个好主意。由于默认情况下pgsql缺少不区分大小写的文本字段,我们不得不使用这个扩展(当然,它工作得很好),但现在在迁移过程中面临着两难的境地。

Update 我已经创建了一个实现此功能的包。它向迁移中添加了一个
passthru()
方法,这样您就可以创建任何想要的字段类型。在本例中,在安装包并添加服务提供者之后,只需执行
$table->passthru('citext','name')在迁移文件中。该软件包名为“laravel nomad”,可在和上找到


是的,这是可以做到的。它需要扩展一些核心文件,但这是可行的。具体来说,您将需要一个新的连接、模式语法和蓝图

首先,在
应用程序
目录下创建一个新目录以保存自定义文件。例如,
app/Extension
。放置在此目录中的文件将扩展核心照明文件,因此您将在此新目录下复制照明文件夹结构

蓝图 要添加可用于迁移的新方法,需要更新蓝图。您将创建一个扩展核心Blueprint类的自定义Blueprint类。此自定义Blueprint类将包含新方法(例如,
ciText()

app/Extension/Database/Schema/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);
    }
    
}
<?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';
    }

}
<?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;
    }

}
联系 现在您已经有了一个自定义蓝图和一个自定义模式语法,可以使用
citext
字段,您需要创建一个自定义连接来使用这些新的自定义类。此自定义连接类将扩展核心PostgresConnection类,以覆盖使用自定义架构语法和自定义蓝图所需的方法

app/Extension/Database/PostgresCustomConnection.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);
    }
    
}
<?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';
    }

}
<?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;
    }

}
如果要创建新的驱动程序名称(例如,
pgsql custom
),则需要在
app/Providers/AppServiceProvider.php
文件中的
register()
方法中添加以下两行:

$this->app->bind('db.connection.pgsql', 'App\Extension\Database\PostgresCustomConnection');
$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
文件,以设置连接到
pgsql custom
(或您命名为驱动程序的任何内容)上的
driver
键的值

工匠 最后,运行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');
    }
}

嗯,我当然希望这会容易些,但我接受了。谢谢@我不知道为什么你的编辑被拒绝,但我修复了dump autoload命令。谢谢您的关注。@CJThompson我已经创建了一个包来完成这项工作,并将信息添加到了答案中。我确信你当前的项目进展顺利,但如果需要,我希望这对未来的项目有所帮助。@EugenDimboiu我很高兴这对你有用。我现在已经创建了一个包来处理这个问题,并在答案中添加了相关信息。我希望它能有所帮助。我只是想提一下,一年半后,我们现在正在使用您的
passthru
软件包。再次感谢,非常好用