尽管代码与MySQL配合得很好,但Laravel迁移仍然失败

时间:2019-08-19 10:51:26

标签: mysql laravel

在我的研究项目的框架中,我正在创建一个名为Permits的表,其中包含uuid列。现在,我想更改它以通过触发器将uuid设置为默认值。我在Workbench中工作时编写了代码,但是效果很好,但是,当我开始在laravel迁移中运行它时,我经常会遇到一个无法摆脱的语法错误:

  PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER ;;
            CREATE TRIGGER before_insert_permits
          ' at line 1")

用于创建表的代码:

public function up(): void
{
    $queryString = /** @lang text */
        '
           CREATE TABLE `permits` (
              `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
              `code_uuid` BINARY(32) NOT NULL,
              `user_id` INT(11) UNSIGNED NOT NULL,
              `emission_date` DATETIME DEFAULT CURRENT_TIMESTAMP,
              `expiry_date` DATE,
              UNIQUE KEY unique_user_id_key (`user_id`),

           CONSTRAINT `users_permits_fk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) 
           ON UPDATE CASCADE ON DELETE CASCADE 
           ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
        ';

    DB::statement($queryString);
}

错误的迁移代码:

 /**
 * Run the migrations.
 *
 * @return void
 */
public function up(): void
{
    $this->dropIdColumn();
    $this->createUUIDcolumn();
    $this->createUUIDtrigger();
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down(): void
{

}

/**
 * Drops `id` column
 */
protected function dropIdColumn(): void
{
    $queryString = /** @lang text */
        '
            ALTER TABLE `permits`
            DROP COLUMN `id`;
        ';

    DB::statement($queryString);
}

/**
 * Makes `uuid_code` primary key
 */
protected function createUUIDcolumn(): void
{
    $queryString = /** @lang text */
        '
            ALTER TABLE `permits`
            ADD COLUMN `uuid` CHAR(36) NULL FIRST;
        ';

    DB::statement($queryString);
}

/**
 * Triggers auto fill for default
 */
protected function createUUIDtrigger(): void
{
    $queryString = /** @lang text */
        '
            DELIMITER ;;
            CREATE TRIGGER before_insert_permits
            BEFORE INSERT ON `permits`
            FOR EACH ROW
            BEGIN
              IF new.uuid IS NULL THEN
                SET new.uuid = uuid();
              END IF;
            END;
            ;;
        ';

    DB::statement($queryString);
}

在纯MySQL中运行的某些代码怎么可能落在Laravel中?我在这里想念什么?

0 个答案:

没有答案