sql >> Databasteknik >  >> RDS >> Mysql

Skapa MySQL-funktion i Laravel 5.5

Jag svarar på min egen fråga

Det verkar som att jag inte hade tillgång till att släppa en MySQL-funktion...

Så jag ersatte DROP FUNCTION IF EXISTS `ST_Distance_Sphere` genom en MySQL-versionskontroll:

$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);

}

Det är lite fult, men det verkar fungera...

REDIGERA

Egentligen fungerar det bara första gången det körs. Det verkar som om den här funktionen kan spara mysql-funktionen i mysql-databasen. Du kommer att få ett fel nästa gång som "Mysql-funktionen finns redan". Du måste bara kommentera blocket ovan.




  1. MariaDB DEFAULT() Förklarat

  2. Hitta det lägsta oanvända värdet i mysql-tabellen

  3. Hur man inkluderar en PHP-variabel i en MySQL-sats

  4. Flera frågedata till en enda HTML-tabell (PHP, MySQL)