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.