Laravel 背包 - 请求了未知的数据库类型 tsvector
Laravel Backpack - Unknown database type tsvector requested
我正在使用 Backpack for Laravel 作为我的 back-end 来管理实体。我有一个 'show' 实体,其定义如下:
public function up()
{
Schema::create('shows', function (Blueprint $table) {
$table->increments('id');
$table->integer('category_id')->nullable();
$table->string('title');
// Created/modified timestamps
$table->timestamps();
});
// Add our search indexes
DB::statement('ALTER TABLE shows ADD searchable tsvector NULL');
DB::statement('CREATE INDEX shows_index ON shows USING GIN (searchable)');
}
如您所见,有一个 'searchable' 列,它是一个 tsvector。这对我的 Postgres FTS 很重要。
在展示实体的 CrudController 中,我为我的标题和 category_id 字段手动定义了以下内容:
// Title
$this->crud->addField([
'name' => 'title',
'label' => 'Show Title',
'type' => 'text'
]);
$this->crud->addColumn([
'name' => 'title',
'label' => 'Title'
]);
// Assigned category ID
$this->crud->addField([ // Select2Multiple = n-n relationship (with pivot table)
'label' => "Assign to Category",
'type' => 'select2',
'name' => 'category_id', // the db column for the foreign key
'entity' => 'category', // the method that defines the relationship in your Model
'attribute' => 'title', // property from the model that is shown to user
'model' => "App\Models\Category", // foreign key model
'data_source' => url("admin/category")
]);
$this->crud->addColumn([
'name' => 'category_id', // The db column name
'label' => "Category", // Table column heading
'type' => 'select',
'entity' => 'category',
'model' => "App\Models\Category",
'attribute' => 'title'
]);
问题出在 category_id 字段。虽然它与可搜索的 tsvector 字段无关,但似乎 'select2' 类型出于某种原因正在查看我的所有列,看到我的 'searchable' 列的 tsvector 类型,并且随时中断编辑节目。我可以很好地看到 Backpack 中的节目索引页面,但是当我在特定节目上单击编辑时,出现以下错误:
Unknown database type tsvector requested,
Doctrine\DBAL\Platforms\PostgreSQL92Platform may not support it.
(View:
resources/views/vendor/backpack/crud/fields/select2.blade.php)
如果我改为尝试将 category_id 字段显示为简单文本类型,我不会收到任何错误并且它可以正常工作:
$this->crud->addField([
'name' => 'category_id',
'label' => 'Category ID',
'type' => 'text'
]);
$this->crud->addColumn([
'name' => 'category_id',
'label' => 'Category ID'
]);
我觉得很奇怪,虽然我在我的 CrudController 中手动定义我的字段,而不是从数据库中提取每个字段,虽然我没有以任何方式引用我的 'searchable' 字段这里的 select2,它仍在查看我的 'searchable' 列,查看 tsvector 类型,然后放弃我。
编辑:
我已将问题追溯到 resources/views/vendor/backpack/crud/fields/select2.blade.php,特别是这段代码:
@if ($entity_model::isColumnNullable($field['name']))
<option value="">-</option>
@endif
如果我注释掉这三行,一切都会正常加载。尽管 $field['name'] 是 'category_id' 而不是 tsvector 'searchable' 字段,但出于某种原因检查它是否可为空会破坏整个过程。我还没有进一步追踪这个。
我自己找到了解决办法。由于 doctrine 不知道 tsvector 类型,它需要在 vendor/backpack/crud/src/CrudTrait.php
内注册
在 isColumnNullable() 函数中,已经有一个不同的不受支持的字段类型(枚举)被转换为字符串的示例:
// register the enum column type, because Doctrine doesn't support it
$conn->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
之后我简单地添加了 tsvector 类型,现在一切正常:
// register the tsvector column type, because Doctrine doesn't support it
$conn->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('tsvector', 'string');
我正在使用 Backpack for Laravel 作为我的 back-end 来管理实体。我有一个 'show' 实体,其定义如下:
public function up()
{
Schema::create('shows', function (Blueprint $table) {
$table->increments('id');
$table->integer('category_id')->nullable();
$table->string('title');
// Created/modified timestamps
$table->timestamps();
});
// Add our search indexes
DB::statement('ALTER TABLE shows ADD searchable tsvector NULL');
DB::statement('CREATE INDEX shows_index ON shows USING GIN (searchable)');
}
如您所见,有一个 'searchable' 列,它是一个 tsvector。这对我的 Postgres FTS 很重要。
在展示实体的 CrudController 中,我为我的标题和 category_id 字段手动定义了以下内容:
// Title
$this->crud->addField([
'name' => 'title',
'label' => 'Show Title',
'type' => 'text'
]);
$this->crud->addColumn([
'name' => 'title',
'label' => 'Title'
]);
// Assigned category ID
$this->crud->addField([ // Select2Multiple = n-n relationship (with pivot table)
'label' => "Assign to Category",
'type' => 'select2',
'name' => 'category_id', // the db column for the foreign key
'entity' => 'category', // the method that defines the relationship in your Model
'attribute' => 'title', // property from the model that is shown to user
'model' => "App\Models\Category", // foreign key model
'data_source' => url("admin/category")
]);
$this->crud->addColumn([
'name' => 'category_id', // The db column name
'label' => "Category", // Table column heading
'type' => 'select',
'entity' => 'category',
'model' => "App\Models\Category",
'attribute' => 'title'
]);
问题出在 category_id 字段。虽然它与可搜索的 tsvector 字段无关,但似乎 'select2' 类型出于某种原因正在查看我的所有列,看到我的 'searchable' 列的 tsvector 类型,并且随时中断编辑节目。我可以很好地看到 Backpack 中的节目索引页面,但是当我在特定节目上单击编辑时,出现以下错误:
Unknown database type tsvector requested, Doctrine\DBAL\Platforms\PostgreSQL92Platform may not support it. (View: resources/views/vendor/backpack/crud/fields/select2.blade.php)
如果我改为尝试将 category_id 字段显示为简单文本类型,我不会收到任何错误并且它可以正常工作:
$this->crud->addField([
'name' => 'category_id',
'label' => 'Category ID',
'type' => 'text'
]);
$this->crud->addColumn([
'name' => 'category_id',
'label' => 'Category ID'
]);
我觉得很奇怪,虽然我在我的 CrudController 中手动定义我的字段,而不是从数据库中提取每个字段,虽然我没有以任何方式引用我的 'searchable' 字段这里的 select2,它仍在查看我的 'searchable' 列,查看 tsvector 类型,然后放弃我。
编辑:
我已将问题追溯到 resources/views/vendor/backpack/crud/fields/select2.blade.php,特别是这段代码:
@if ($entity_model::isColumnNullable($field['name']))
<option value="">-</option>
@endif
如果我注释掉这三行,一切都会正常加载。尽管 $field['name'] 是 'category_id' 而不是 tsvector 'searchable' 字段,但出于某种原因检查它是否可为空会破坏整个过程。我还没有进一步追踪这个。
我自己找到了解决办法。由于 doctrine 不知道 tsvector 类型,它需要在 vendor/backpack/crud/src/CrudTrait.php
内注册在 isColumnNullable() 函数中,已经有一个不同的不受支持的字段类型(枚举)被转换为字符串的示例:
// register the enum column type, because Doctrine doesn't support it
$conn->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
之后我简单地添加了 tsvector 类型,现在一切正常:
// register the tsvector column type, because Doctrine doesn't support it
$conn->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('tsvector', 'string');