Laravel PHPUnit错误mysql全文索引

vfh0ocws  于 2023-04-07  发布在  PHP
关注(0)|答案(2)|浏览(167)

添加FULLTEXT索引后在Laravel中运行PHPUnit时出现错误

Doctrine\DBAL\Driver\PDOException: SQLSTATE[HY000]: General error: 1 near "name": syntax error

经过调查,我添加的迁移导致的错误

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddFulltextIndexToProductName extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        DB::statement('ALTER TABLE products ADD FULLTEXT fulltext_index(name)');
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        DB::statement('DROP INDEX `fulltext_index`');
    }
}

如果我删除迁移代码,测试将正常运行
有人遇到过这个问题吗?

t2a7ltrp

t2a7ltrp1#

通常Laravel测试都是在内存中使用sqlite数据库,这条语句在你的迁移中将不起作用。你可以在这里查看如何创建sqlite全文索引:https://www.sqlitetutorial.net/sqlite-full-text-search/
由于Laravel不支持开箱即用的全文搜索,我假设你已经编写了自定义函数,这可能也不会在测试中工作。
要解决此问题,您可以:

  • 使用mysql进行测试(不推荐,因为它很慢)
  • 使用存储库模式
  • 在测试中跳过迁移(如果您不测试搜索-您不需要它)。
  • 使用laravel scout进行搜索
gijlo24d

gijlo24d2#

对于条件索引,我建议检查DB驱动程序,而不是检查环境,例如:

return new class () extends Migration {
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->string('body');

            if (!$this->isSqlite()) {
                $table->fullText('body');
            }

            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('posts');
    }

    private function isSqlite(): bool
    {
        return 'sqlite' === Schema::connection($this->getConnection())
                ->getConnection()
                ->getPdo()
                ->getAttribute(PDO::ATTR_DRIVER_NAME);
    }
};

相关问题