当前位置: 首页 > 知识库问答 >
问题:

无法通过Laravel迁移实现MySQL/MariaDB功能

端木望
2023-03-14

我正在尝试创建一个mysql存储函数

        DROP FUNCTION IF EXISTS getDistance;
        
        DELIMITER $$
            CREATE FUNCTION `getDistance`(`lat1` VARCHAR(255), `lng1` VARCHAR(255), `lat2` VARCHAR(255), `lng2` VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
            BEGIN
                DECLARE distance varchar(255);
           
                SELECT (6371 * acos(cos(radians(lat2)) * cos(radians(lat1)) * cos(radians(lng1) - radians(lng2)) + sin(radians(lat2)) * sin(radians(lat1)))) INTO distance;
                 
                if(distance is null) then
                    return null;
                else 
                    return distance;
                end if;
            END
        $$
        DELIMITER ;

如果我通过phpMyAdmin执行函数,工作就会很好,函数就会在数据库中创建

但是,当我试图运行Laravel(V6.x)迁移来创建存储的函数时,我遇到了错误

<?php

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

class CreateStoredFunction extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
       DB::unprepared('
            DROP FUNCTION IF EXISTS getDistance;
            
            DELIMITER $$
                CREATE FUNCTION `getDistance`(`lat1` VARCHAR(255), `lng1` VARCHAR(255), `lat2` VARCHAR(255), `lng2` VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
                BEGIN
                    DECLARE distance varchar(255);
               
                    SELECT (6371 * acos(cos(radians(lat2)) * cos(radians(lat1)) * cos(radians(lng1) - radians(lng2)) + sin(radians(lat2)) * sin(radians(lat1)))) INTO distance;
                     
                    if(distance is null) then
                        return null;
                    else 
                        return distance;
                    end if;
                END
            $$
            DELIMITER ;
        ');
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        DB::unprepared('DROP FUNCTION IF EXISTS getDistance');
    }
}

错误

条令\dbal\driver\pdo\exception::(“SQLState[42000]:语法错误或访问违规:1064您的SQL语法中有错误;请查看与您的MariaDB服务器版本相对应的手册,以了解在'delimiter$$CREATE FUNCTIONgetdistance(lat1VARCHAR(255)'第1行使用的正确语法”)

共有1个答案

段干恺
2023-03-14

delimiter不是有效的SQL语句。这只是一个MySql客户端命令。所以别用了。你得到的错误告诉你这一点。

您可以在Laravel中创建一个存储过程,如下所示,这将使delimiter过时

试试这个

class CreateStoredFunction extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
       DB::unprepared('
            DROP FUNCTION IF EXISTS getDistance;
            
            
                CREATE FUNCTION `getDistance`(`lat1` VARCHAR(255), `lng1` VARCHAR(255), `lat2` VARCHAR(255), `lng2` VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
                BEGIN
                    DECLARE distance varchar(255);
               
                    SELECT (6371 * acos(cos(radians(lat2)) * cos(radians(lat1)) * cos(radians(lng1) - radians(lng2)) + sin(radians(lat2)) * sin(radians(lat1)))) INTO distance;
                     
                    if(distance is null) then
                        return null;
                    else 
                        return distance;
                    end if;
                END
           
        ');
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        DB::unprepared('DROP FUNCTION IF EXISTS getDistance');
    }
}
 类似资料:
  • 运行php artisan migrate时,它会给出以下错误消息 1.PDOException::(“SQLSTATE[HY000][2002]连接被拒绝”)/Users/redblac/olivertes/vendor/laravel/framework/src/illusted/Database/Connectors/Connector.php:70 2 PDO::_构造(“mysql:ho

  • 问题内容: 有没有办法在Laravel 4迁移中生成存储的MYSQL过程? 例如,这是一个简单的过程生成查询,以字符串形式存储(通过Heredoc) 在迁移函数中运行此命令时,出现以下错误: 问题答案: 您的代码有两个主要问题 不是有效的sql语句。这只是一个MySql客户端命令。因此,请不要使用它。 顺便说一句 ,您得到的错误恰恰告诉您。 您无法使用来执行代码,因为它使用的预准备语句源代码。您可

  • 我正在从事一个项目,我正在使用laravel 5.8。这里我想创建一个外键。我试了很多次,但每次都收到一条关于迁移时间的错误消息。有三个表一个是行业,是小学和学生,这些是第二个表。我想在这两个辅助表trade_id上创建一个外键作为键的名称。 这是交易表(主表)。 这是学生表(辅助表)。 这是放置表(辅助表)。 在迁移时出现错误。

  • 我正在上进行开发,并在本地环境和生产环境中进行以下迁移。 我想用以下经过调整的字段来更改迁移: 由于我正在生产中使用当前的迁移,我不希望丢失数据。 我只是尝试用我的新表定义修改迁移文件,但我得到了: 有什么建议如何在Laravel适当地改变迁移? 谢谢你的回复!

  • 迁移cache分页 仓库地址: cache 安装 composer require illuminate/cache 暂时实现 redis方式 还需安装 composer require illuminate/redis composer require predis/predis //个人比较喜欢predis 启动predis function frameInitialized() {

  • 我买了新的MacBook Pro,我在其中安装了mysql,然后安装sequel Pro来查看表和数据库,但是当我命令时,这个错误指控错误图像 近30个小时来,我一直在忍受这个问题,有人能帮我看一下吗