如果使用Postgres 14/MySQL8服务器,我可以定义基于json字段的唯一索引吗?

在下一次迁移中:

Schema::create('quiz_categories', function (Blueprint $table) {
    $table->id();
    $table->json('name')->comment('This column is used for i18n support');
    $table->boolean('active')->default(false);
    $table->timestamps();

    $table->unique(['name', 'active'], 'quiz_categories_name_active_index');
});

我收到错误:

  Illuminate\Database\QueryException 

  SQLSTATE[42704]: Undefined object: 7 ERROR:  data type json has no default operator class for access method "btree"
HINT:  You must specify an operator class for the index or define a default operator class for the data type. (Connection: pgsql, SQL: alter table "quiz_categories" add constraint "quiz_categories_name_active_index" unique ("name", "active"))

推荐答案

您可以在PostgreSQL中的JSON字段上构建唯一索引,但需要执行一些额外的步骤.PostgreSQL没有为JSON数据类型上的"btree"访问方法提供默认的操作符类. 但是,jsonb为"btree"访问函数提供了一个默认的操作符类,因此您可以使用它而不是json来在JSON字段上创建唯一索引. 下面是如何更改迁移以使用jsonb的方法.

Schema::create('quiz_categories', function (Blueprint $table) {
    $table->id();
    $table->jsonb('name')->comment('This column is used for i18n support');
    $table->boolean('active')->default(false);
    $table->timestamps();

    $table->unique(['name', 'active'], 'quiz_categories_name_active_index');
});

希望它能奏效:)

Laravel相关问答推荐

Laravel使用PostgreSQL显示";`try 读取null`上的属性,而不是SQL错误消息

Dompdf 古吉拉特语和印地语文本未正确显示

通过 laravel 中的 url 传递多个字符串作为参数以从数据库中删除特定数据

如何保存/重定向 Laravel Artisan 命令的输出?

Laravel:子文件夹中的 lang 文件

Laravel 中的 index()" 是什么意思?

Laravel 保存一对多关系

为什么人们将 .env 放入 gitignore?

如何在没有 Eloquent 的情况下创建 Laravel 模型?

Homebrew PHP 似乎没有链接

Cookie::forget 不工作 laravel 5.1

Laravel 分页方法不适用于 map 集合?

在Lumen框架中启用会话

日期验证 - 如何本地化/翻译字符串今天和明天

Laravel 项目旁边的 Wordpress 项目(在 public_html 文件夹中)

改变模式生成器中的列长度?

Laravel php artisan 产生错误

日期时间格式无效:1366 字符串值不正确

php artisan migrate - SQLSTATE [HY000] [1045] 用户'laravel'@'localhost'的访问被拒绝

带有 Xdebug 的 Laravel 5 总是抛出The payload is invalid..