sql >> Base de Datos >  >> RDS >> Mysql

Crear función MySQL en Laravel 5.5

Respondo mi propia pregunta

Parece que no tuve acceso para eliminar una función de MySQL...

Así que reemplacé DROP FUNCTION IF EXISTS `ST_Distance_Sphere` mediante una comprobación de la versión de MySQL:

$mysql_version_check = DB::select(DB::raw('SHOW VARIABLES LIKE "version";'));
$mysql_version = $mysql_version_check[0]->Value;
if (substr($mysql_version,2, 1) < '7' AND substr($mysql_version,4, 1) < '6') {
    $sql = '
        CREATE FUNCTION `ST_Distance_Sphere` (point1 POINT, point2 POINT)

            RETURNS FLOAT
            no sql deterministic
            BEGIN
                declare R INTEGER DEFAULT 6371000;
                declare `φ1` float;
                declare `φ2` float;
                declare `Δφ` float;
                declare `Δλ` float;
                declare a float;
                declare c float;
                set `φ1` = radians(y(point1));
                set `φ2` = radians(y(point2));
                set `Δφ` = radians(y(point2) - y(point1));
                set `Δλ` = radians(x(point2) - x(point1));

                set a = sin(`Δφ` / 2) * sin(`Δφ` / 2) + cos(`φ1`) * cos(`φ2`) * sin(`Δλ` / 2) * sin(`Δλ` / 2);
                set c = 2 * atan2(sqrt(a), sqrt(1-a));

                return R * c;
            END;
    ';

    DB::unprepared($sql);

}

Es un poco feo, pero parece funcionar...

EDITAR

En realidad, funcionará solo la primera vez que se ejecute. Parece que esta función podría guardar la función mysql en la base de datos mysql. Tendrá un error las próximas veces como "La función Mysql ya existe". Solo tienes que comentar el bloque de arriba.