Saya menjawab pertanyaan saya sendiri
Sepertinya saya tidak memiliki akses untuk menghapus fungsi MySQL...
Jadi saya mengganti DROP FUNCTION IF EXISTS `ST_Distance_Sphere`
dengan pemeriksaan versi 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);
}
Agak jelek, tapi tampaknya berhasil...
EDIT
Sebenarnya, ini hanya akan berfungsi saat pertama kali dijalankan. Tampaknya fungsi ini dapat menyimpan fungsi mysql ke database mysql. Anda akan mengalami kesalahan di waktu berikutnya seperti "Fungsi MySQL sudah ada". Anda hanya perlu mengomentari blok di atas.