TL; DR使用Skysplit's solutionを、可能な場合。
ここで私が思いついたのです。さらに複雑な問題の1つは、デフォルトでlaravelがdisablespdo
のエミュレーションモードです。同じ名前の名前付きパラメーター・マーカーをステートメント内で複数回使用することはできません。
$q = MyModel::whereRaw(MyModel::sql_distance_to() . ' < :dist');
run_query_with_params(MyModel::class, $q,
array_merge(MyModel::sql_distance_to_params($lat, $lng), [
'dist' => 10,
]));
class MyModel {
static function sql_distance_to() {
return 'ACOS(
SIN(RADIANS(lat)) * SIN(RADIANS(:lat1))
+ COS(RADIANS(lat)) * COS(RADIANS(:lat2))
* COS(RADIANS(:lng - lng))
) * 6371';
}
static function sql_distance_to_params($lat, $lng) {
return [
'lat1' => $lat,
'lat2' => $lat,
'lng' => $lng,
];
}
}
function run_query_with_params($class, $q, $params)
{
$r = \DB::select($q->toSql(), $params);
return call_user_func([$class, 'hydrate'], $r);
}
良い点。しかし、DB :: rawで式を囲む必要はありません。 –
@ x-yuriああ、もちろん! :) あなたが正しい。大きなものではありませんが、変わる価値があります。ありがとう! – Skysplit