在 Laravel 中迁移 phpmyadmin 中的 sql 函数时出现问题
Problem with migrating sql function in phpmyadmin in Laravel
我有 sql 函数,我需要将其迁移到 phpmyadmin 以使我的代码正常工作。我在为 sql 函数插入代码的地方进行迁移,然后我执行 php artisan migrate:fresh --seed 它成功完成并填充所有 table 并且它表明迁移有效。
Migrating: 2022_01_28_115051_add_calculate_distance_function
Migrated: 2022_01_28_115051_add_calculate_distance_function (0.07ms)
但是当我进入 phpmyadmin 时,它没有创建功能。我以前从未使用过此 sql 函数,因此非常感谢您的帮助。我使用 Laravel 8.65。这是我的迁移。
迁移
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
class AddCalculateDistanceFunction extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::raw('DROP FUNCTION IF EXISTS calculate_distance;
CREATE FUNCTION calculate_distance(lat1 FLOAT, lon1 FLOAT,
lat2 FLOAT, lon2 FLOAT) RETURNS float
READS SQL DATA
DETERMINISTIC
BEGIN
RETURN
111.111 *
DEGREES(ACOS(COS(RADIANS(lat1))
* COS(RADIANS(lat2))
* COS(RADIANS(lon1 - lon2))
+ SIN(RADIANS(lat1))
* SIN(RADIANS(lat2)))) ;
END
');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::unprepared('DROP FUNCTION IF EXISTS calculate_distance;');
}
}
DB::raw
returns 将在查询生成器中使用的 Expression
。它没有 运行 sql.
为此使用 DB::statement
。
public function up()
{
DB::statement("DROP FUNCTION IF EXISTS calculate_distance;");
DB::statement("CREATE FUNCTION calculate_distance(lat1 FLOAT, lon1 FLOAT, ...");
}
public function down()
{
DB::statement("DROP FUNCTION IF EXISTS calculate_distance;");
}
您还可以使用 Laravel 架构生成器。检查文档 here
Schema::drop('calculate_distance');
Schema::dropIfExists('calculate_distance');
Schema::create('calculate_distance', function($table)
{
$table->string('latitude');
});
我有 sql 函数,我需要将其迁移到 phpmyadmin 以使我的代码正常工作。我在为 sql 函数插入代码的地方进行迁移,然后我执行 php artisan migrate:fresh --seed 它成功完成并填充所有 table 并且它表明迁移有效。
Migrating: 2022_01_28_115051_add_calculate_distance_function
Migrated: 2022_01_28_115051_add_calculate_distance_function (0.07ms)
但是当我进入 phpmyadmin 时,它没有创建功能。我以前从未使用过此 sql 函数,因此非常感谢您的帮助。我使用 Laravel 8.65。这是我的迁移。
迁移
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
class AddCalculateDistanceFunction extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::raw('DROP FUNCTION IF EXISTS calculate_distance;
CREATE FUNCTION calculate_distance(lat1 FLOAT, lon1 FLOAT,
lat2 FLOAT, lon2 FLOAT) RETURNS float
READS SQL DATA
DETERMINISTIC
BEGIN
RETURN
111.111 *
DEGREES(ACOS(COS(RADIANS(lat1))
* COS(RADIANS(lat2))
* COS(RADIANS(lon1 - lon2))
+ SIN(RADIANS(lat1))
* SIN(RADIANS(lat2)))) ;
END
');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::unprepared('DROP FUNCTION IF EXISTS calculate_distance;');
}
}
DB::raw
returns 将在查询生成器中使用的 Expression
。它没有 运行 sql.
为此使用 DB::statement
。
public function up()
{
DB::statement("DROP FUNCTION IF EXISTS calculate_distance;");
DB::statement("CREATE FUNCTION calculate_distance(lat1 FLOAT, lon1 FLOAT, ...");
}
public function down()
{
DB::statement("DROP FUNCTION IF EXISTS calculate_distance;");
}
您还可以使用 Laravel 架构生成器。检查文档 here
Schema::drop('calculate_distance');
Schema::dropIfExists('calculate_distance');
Schema::create('calculate_distance', function($table)
{
$table->string('latitude');
});