J'essaie d'exécuter une requête qui trouvera des lieux à une distance donnée de n'importe quel lieu donné. Il s'agit d'un résultat de recherche où les utilisateurs peuvent sélectionner plusieurs lieux à visiter.
Mon approche actuelle consiste à utiliser ST_ClosestPoint
et transmet un tableau de ST_Point
généré en PHP. Ensuite, je passe cette chaîne dans ST_Collect
.
$points = $locations->map(function ($location) {
return sprintf('ST_Point(%s, %s)', $location->longitude, $location->latitude);
})->implode(', ');
SELECT *
FROM listing_locations
WHERE ST_DWithin(
coordinate,
ST_ClosestPoint(coordinate, ST_Collect(Array[%s]),
1000,
FALSE)
Cependant, cela ne fonctionne pas car cela ressemble à ST_ClosestPoint
n'aime pas ces arguments contradictoires :
SQLSTATE[42883]: Undefined function: 7 ERROR: function st_closestpoint(geometry, geography) does not exist
J'ai un gist(coordinate::geography)
index sur listing_locations
qui semble être utile à utiliser.
Qu'est-ce qui m'échappe ? Existe-t-il une meilleure façon de procéder ou s'agit-il d'une mauvaise approche ? Devrais-je effectuer la requête à chaque fois avec un emplacement différent ?