无法通过 Laravel 迁移 mysql/mariaDB 运行
Unable to mysql/mariaDB function through Laravel migrations
我正在尝试创建一个 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');
}
}
错误
Doctrine\DBAL\Driver\PDO\Exception::("SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DELIMITER $$
CREATE FUNCTION getDistance
(lat1
VARCHAR(255), ' at line 1")
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');
}
}
我正在尝试创建一个 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');
}
}
错误
Doctrine\DBAL\Driver\PDO\Exception::("SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DELIMITER $$ CREATE FUNCTION
getDistance
(lat1
VARCHAR(255), ' at line 1")
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');
}
}