Laravel Backpack - 未知数据库类型tsvector请求

时间:2017-06-30 00:12:14

标签: php postgresql laravel backpack-for-laravel

我使用Backpack for Laravel作为管理实体的后端。我有一个' 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)');
    }

正如您所看到的那样,有一个可搜索的'列是一个tsvector。这对我的Postgres FTS非常重要。

在show实体的CrudController中,我手动为我的title和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'由于某种原因,类型正在查看我的所有列,看到我的可搜索的类型的tsvector类型'列,并随时打破我编辑节目。我可以在Backpack中看到show index页面,但是当我点击特定节目的编辑时,我收到以下错误:

  

请求了未知的数据库类型tsvector,   Doctrine \ DBAL \ Platforms \ PostgreSQL92Platform可能不支持它。   (视图:   资源/视图/供应商/背包/污物/场/ 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中手动定义了我的字段,而不是从数据库中提取每个字段,虽然我没有引用我的“可搜索的”字样,但我觉得很奇怪。 ;这里有任何关于select2的领域,它仍然在关注我的可搜索的'列,看到tsvector类型,放弃我。

修改

我已将问题追溯到resources / views / vendor / backpack / crud / fields / select2.blade.php,特别是这段代码:

@if ($entity_model::isColumnNullable($field['name']))
            <option value="">-</option>
        @endif

如果我评论这三行,一切都很好。尽管$ field [&#39; name&#39;]属于&#39; category_id&#39;而不是tsvector&#39; searchable&#39;字段,由于某种原因检查它是否可以为空打破了整个事情。我还没有进一步追踪这一点。

1 个答案:

答案 0 :(得分:2)

我自己找到了一个解决方案。由于学说不知道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');