Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Criar função MySQL no Laravel 5.5


Eu respondo minha própria pergunta

Parece que não tive acesso para descartar uma função do MySQL ...

Então eu substituí DROP FUNCTION IF EXISTS `ST_Distance_Sphere` por uma verificação de versão do 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);

}

É um pouco feio, mas parece funcionar...

EDITAR


Na verdade, ele funcionará apenas na 1ª vez que for executado. Parece que esta função pode salvar a função mysql no banco de dados mysql. Você terá um erro nas próximas vezes como "A função MySQL já existe". Basta comentar o bloco acima.