在 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');
});