如何在 laravel 5.5 迁移中将 DB::unprepared() 用于 mysql 函数和存储过程

Posted

技术标签:

【中文标题】如何在 laravel 5.5 迁移中将 DB::unprepared() 用于 mysql 函数和存储过程【英文标题】:how to use DB::unprepared() for mysql function and stored procedure in laravel 5.5 migration 【发布时间】:2018-01-31 04:04:30 【问题描述】:

阅读旧问题后,我尝试在迁移文件中使用 DB::unprepared()。但它只给了我“遇到的非数字值”错误,并且数据库中没有任何变化。但是,当我通过添加分隔符将 sql 语句直接输入 phpmyadmin 时,它可以工作。请建议我缺少什么。

DB::unprepared('
    CREATE FUNCTION getNextCustomSeq
    (
        sSeqName VARCHAR(50),
        sSeqGroup VARCHAR(10)
    ) RETURNS VARCHAR(20)
    BEGIN
        DECLARE nLast_val INT;

        SET nLast_val =  (SELECT seq_val
                              FROM _sequence
                              WHERE seq_name = sSeqName
                                    AND seq_group = sSeqGroup);
        IF nLast_val IS NULL THEN
            SET nLast_val = 1;
            INSERT INTO _sequence (seq_name,seq_group,seq_val)
            VALUES (sSeqName,sSeqGroup,nLast_Val);
        ELSE
            SET nLast_val = nLast_val + 1;
            UPDATE _sequence SET seq_val = nLast_val
            WHERE seq_name = sSeqName AND seq_group = sSeqGroup;
        END IF;

        SET @ret = (SELECT concat(sSeqGroup,'-',lpad(nLast_val,6,0)));
        RETURN @ret;
    END//
    ');

【问题讨论】:

警告从 PHP 7.1 when invalid strings are coerced using operators expecting numbers 返回。你能告诉我们它违反了哪条线吗? 从此行 SET @ret = (SELECT concat(sSeqGroup,'-',lpad(nLast_val,6,0))); 我找不到可靠的文档,但你能先试试原始声明吗?即DB::unprepared(DB::raw('... your query...')) 对不起,它也不起作用。 【参考方案1】:

哦,哈哈,这是一个错字。你忘记转义了:

SET @ret = (SELECT concat(sSeqGroup,'-',lpad(nLast_val,6,0)));

应该是这样的:

SET @ret = (SELECT concat(sSeqGroup,\'-\',lpad(nLast_val,6,0)));

更新:

DB::unprepared('
    CREATE FUNCTION getNextCustomSeq
    (
        sSeqName VARCHAR(50),
        sSeqGroup VARCHAR(10)
    ) RETURNS VARCHAR(20)
    BEGIN
        DECLARE nLast_val INT;

        SET nLast_val =  (SELECT seq_val
                              FROM _sequence
                              WHERE seq_name = sSeqName
                                    AND seq_group = sSeqGroup);
        IF nLast_val IS NULL THEN
            SET nLast_val = 1;
            INSERT INTO _sequence (seq_name,seq_group,seq_val)
            VALUES (sSeqName,sSeqGroup,nLast_Val);
        ELSE
            SET nLast_val = nLast_val + 1;
            UPDATE _sequence SET seq_val = nLast_val
            WHERE seq_name = sSeqName AND seq_group = sSeqGroup;
        END IF;

        SET @ret = (SELECT concat(sSeqGroup,\'-\',lpad(nLast_val,6,0)));
        RETURN @ret;
    END//
');

这里发生的事情是你没有转义引号,PHP 认为你在做'long chunk of text' - 'long chunk of text',这当然会引发错误A non-numeric value encountered。此警告告诉您您正在尝试对一个或多个非数字字符串进行数学表达式:http://php.net/manual/en/migration71.other-changes.php

【讨论】:

谢谢。我也发现了。必须在 END 之后删除 // 对不起。你可以请检查我的另一个问题。 ***.com/questions/48376840/… 。谢谢

以上是关于如何在 laravel 5.5 迁移中将 DB::unprepared() 用于 mysql 函数和存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 5.5 中将数组作为 API 资源返回

如何在 Laravel 5.5 中将数据插入表格并获取电子邮件通知?

Laravel 5.5 中的迁移问题

DB::statement();在 Laravel (5.5)

如何在 laravel 迁移中将字符串转换为布尔值?

Laravel 5.5 使用生产数据库整合迁移