Laravel + PostgreSQL Ltree

Laravel + PostgreSQL Ltree

如何写迁移文件添加字段类型'ltree'(PostgreSQL)

Schema::create('table', function (Blueprint $table) {
     ....
$table->ltree('path');
}

无效。

谢谢!

查看可用功能的手册: https://laravel.com/docs/5.1/migrations#creating-columns

Laravel 的目标是兼容性,因此除非所有支持的数据库中都有等效结构,否则它们不太可能原生支持它。

您可以 运行 SQL 语句手动使用 DB::statement('CREATE TABLE ...')

请记住,您的应用程序将被锁定到 postgres,这可能并不理想。

作为快速解决方案,在您的迁移中使用此方法:

public function up ()
{
    Schema::create('locations', function (Blueprint $table) {
        $table->increments('id');
        $table->uuid('uuid')->unique();
        $table->string('path', 255); // <--- my ltree field

        $table->timestamps();
    });

    $query = 'ALTER TABLE locations ALTER COLUMN path TYPE "ltree" USING "path"::"ltree";';
    \Illuminate\Support\Facades\DB::connection()->getPdo()->exec($query);
}

这里 business_category 是我的 ltree 数据类型

public function up()
{
    Schema::create('business_categories', function (Blueprint $table) {
        $table->increments('business_category_id')->generatedAs();
        $table->string('business_category')->nullable();
        $table->timestamps();
        
    });
    
    DB::statement("ALTER TABLE business_categories ADD COLUMN business_category_path ltree");
    DB::statement("CREATE INDEX business_categories_business_category_path_gist_idx ON business_categories USING gist(business_category_path)");
    DB::statement("CREATE INDEX business_categories_business_category_path_idx ON business_categories USING btree(business_category_path)");
}

如果 ltree 扩展未启用,您还必须启用它。

try {
    DB::statement("create extension ltree");
} catch (\Throwable $e) {
    print "ltree extension already exist";
}