Mysql
 sql >> Database >  >> RDS >> Mysql

Crea la funzione MySQL in Laravel 5.5

Rispondo alla mia domanda

Sembra che non avessi accesso per eliminare una funzione MySQL...

Quindi ho sostituito DROP FUNCTION IF EXISTS `ST_Distance_Sphere` da un controllo della versione 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);

}

È un po' brutto, ma sembra funzionare...

MODIFICA

In realtà, funzionerà solo la prima volta che viene eseguito. Sembra che questa funzione possa salvare la funzione mysql nel database mysql. Avrai un errore le prossime volte come "La funzione MySQL esiste già". Devi solo commentare il blocco sopra.