Аз сам отговарям на въпроса си
Изглежда, че нямах достъп да пусна MySQL функция...
Затова замених DROP FUNCTION IF EXISTS `ST_Distance_Sphere`
чрез проверка на версията на 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);
}
Малко е грозно, но изглежда работи...
РЕДАКТИРАНЕ
Всъщност той ще работи само при първия път, когато се изпълни. Изглежда, че тази функция може да запише функцията mysql в базата данни на mysql. Следващите пъти ще имате грешка като „функцията Mysql вече съществува“. Просто трябва да коментирате блока по-горе.