SilverStripe 3.4.0内のmysqlごとに位置Yを中心に半径X以内の場所をフィルタリングしています。SilverStripe内のmysqlごとに半径X以内の場所ORM
これまで、サークル内のIDを取得するためのrawクエリを実装しました。複数の条件に対してフィルタを適用する必要があり、ジオフィルタはその1つのみであるため、SilverStripe ORMごとにフィルタリングするために使用します。
参照してください。また、 "店舗検索" の例をグーグル:私はDataObjectの-TabelのMyISAM
DataObject:
create_table_options:
MySQLDatabase:
'ENGINE=MyISAM'
これは望ましい結果を提供をしたが、細胞外を必要としました_configで https://developers.google.com/maps/articles/phpsqlsearch_v3
$searchDistance = '...';
$searchLat = '...';
$searchLng = '...';
$geolimitedIDs = DB::query('SELECT id, (6371 * acos(cos(radians('.$searchLat.')) * cos(radians(Latitude)) * cos(radians(Longitude) - radians('.$searchLng.')) + sin(radians('.$searchLat.')) * sin(radians(Latitude))))
AS distance
FROM "DataObject"
HAVING distance < ' . $searchDistance . '
ORDER BY distance')->column();
if($geolimitedIDs) {
$DataObjects = $DataObjects->filter(array(
'ID' => $geolimitedIDs
));
}
クエリ。 ジオフィルタをORM内のクエリに直接追加することはできますか?
フィルタをORMに直接追加するとはどういう意味ですか? – Shadow
@Shadow - SilverStripeは遅延ロードしません。これは、クエリ$ DataObjectsを変更できることを意味します。 $ DataObjects-> where( '...')のようなものです。 – munomono
あなたのクエリにはhaving節しかないので、dataobjectクラスの 'having()'メソッドを使用します。しかし、 'filter()'メソッドにあるものは、クエリのwhere句に簡単に含めることができます。 SilverStripeの方法で生のクエリを書き直す方法を見つけるのではなく、生のクエリにこの基準を追加する方が簡単かもしれません。 – Shadow