मैं अपने प्रश्न का उत्तर स्वयं देता हूं
ऐसा लगता है कि मेरे पास 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 फ़ंक्शन पहले से मौजूद है"। आपको बस ऊपर दिए गए ब्लॉक पर कमेंट करना है।