Mysql
 sql >> Base de données >  >> RDS >> Mysql

Créer une fonction MySQL dans Laravel 5.5

Je réponds à ma propre question

Il semble que je n'ai pas eu accès pour déposer une fonction MySQL...

J'ai donc remplacé DROP FUNCTION IF EXISTS `ST_Distance_Sphere` par une vérification de version 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);

}

C'est un peu moche, mais ça a l'air de marcher...

MODIFIER

En fait, cela ne fonctionnera que la 1ère fois qu'il sera exécuté. Il semble que cette fonction pourrait enregistrer la fonction mysql dans la base de données mysql. Vous aurez une erreur la prochaine fois comme "la fonction MySQL existe déjà". Il vous suffit de commenter le bloc ci-dessus.