Tôi trả lời câu hỏi của chính mình
Có vẻ như tôi không có quyền truy cập để bỏ một hàm MySQL ...
Vì vậy, tôi đã thay thế DROP FUNCTION IF EXISTS `ST_Distance_Sphere`
bằng cách kiểm tra phiên bản 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);
}
Nó hơi xấu, nhưng nó có vẻ hoạt động ...
CHỈNH SỬA
Trên thực tế, nó sẽ chỉ hoạt động trong lần đầu tiên nó được thực thi. Có vẻ như hàm này có thể lưu hàm mysql vào cơ sở dữ liệu mysql. Bạn sẽ gặp lỗi trong những lần tiếp theo như "Hàm Mysql đã tồn tại". Bạn chỉ cần nhận xét khối ở trên.