/ / ORM-Objekt - Entfernen Sie einen Datensatz und fügen Sie eine Eigenschaft hinzu - coldfusion, coldfusion-9

ORM-Entität - Entfernen Sie einen Datensatz und fügen Sie eine Eigenschaft hinzu - Coldfusion, Coldfusion-9

Ich stelle einen Shop-Finder zusammen, der funktioniertin einem Umkreis von einer Postleitzahl. Ich habe das schon oft mit Standard-Queries und QoQs gemacht, aber jetzt versucht, mit cf9 ORM eine zu erstellen ... aber es schien, als hätte ich mit dem letzten Bit meine Grenzen erreicht.

Ich ziehe eine Entität heraus und bearbeite sie. Am Ende muss ich:

ein. Einen Datensatz entfernen, wenn er bestimmte Kriterien nicht erfüllt (Entfernung ist größer als vom Benutzer angegeben)

ODER b. Fügen Sie dem Datensatz eine neue Eigenschaft hinzu, um die Entfernung zu speichern.

Am Ende möchte ich in meiner Entität nur die Stores, die sich innerhalb des vom Benutzer angegebenen Bereichs befinden, wobei jeder Datensatz die berechnete Entfernung enthält.

Der beste Weg, um zu sehen, was ich versuche, ist die volle Funktion zu sehen

Anregungen sehr geschätzt !!

public function getByPostcodeRadius(required postcode="",
required radius=""){

//set some initial vals
rs = {};
geo = New _com.util.geo().init();
local.postcodeGeo = geo.getGeoCode("#arguments.postcode#, Australia");
local.nearbyStores = "";
local.returnStores = {};

//load stores
local.stores = entityload("stores");

//loop over all stores and return list of stores inside radius
for(i=1; i <= ArrayLen(local.stores); i++){

store = {};
store.id = local.stores[i].getID();
store.geoCode = local.stores[i].getGeoCode();
store.Lat = ListgetAt(store.geoCode,1);
store.Lng = ListgetAt(store.geoCode,2);

distance = geo.getDistanceByGeocode(local.postcodeGeo.Lat,local.postcodeGeo.Lng,store.Lat,store.Lng);


//************************
//HERE IS WHERE I AM STUCK.

if (distance LT arguments.radius){

//here I need to add a property "distance" and set it"s value
local.stores[i].distance = distance; // this adds it to the object, but not with the PROPERTIES

} else {

// here i need to remove the store from the object as it"s distance was greater than the one passed in
arrayDeleteAt(local.stores,i); //this clearly isn"t working, as positions are changing with each loop over

}

}

return local.stores;
}

Antworten:

1 für die Antwort № 1

Ich würde dies aus einem anderen Blickwinkel angehen:

1) Anstatt alle Geschäfte, die nicht zusammenpassen, aus dem Array zu löschen, würde ich ein Array mit denjenigen erstellen, die dies tun, und es zurückgeben.

2) Wenn der Abstand für jede Abfrage spezifisch ist undkeine Eigenschaft des Store-Objekts, dann würde ich nicht versuchen, es dem Store hinzuzufügen, sondern es einfach mit den spezifischen Daten "verknüpfen", die ich für diese Suche zurückgebe.

Um die 2 zusammen zu setzen, würde ich ein Array von zurückgebenStrukturen, die das Geschäftsobjekt und dessen Entfernung von der angeforderten Postleitzahl enthalten. (Sie können nur eine einzige Struktur des Geschäftsobjekts und der Entfernung zurückgeben, wobei die Geschäfts-ID als Schlüssel dient. Ich arbeite jedoch lieber mit Arrays.)

Hier "s, wie ich es codiere" (nicht getestet, da ich keine Geoklasse oder Entitätscode habe)

public array function getByPostcodeRadius(required postcode="", required radius=""){
hint="I return an array of structs each containing a store object within the requested radius and its distance from the requested post code"
// Geo settings
local.geo = New _com.util.geo().init();
local.postcodeGeo = local.geo.getGeoCode("#arguments.postcode#, Australia");
// initialise the array of structs to return, which will contain stores within the requested radius and their distance from the postcode
local.nearbyStores = [];
//load all stores
local.stores = entityload("stores");
//loop over all stores and add those inside the radius to the return array with their distance
for( var storeObject in local.stores ){
// determine the lat-lng for this store
local.storeLat = ListgetAt(storeObject.getGeoCode(),1);
local.storeLng = ListgetAt(storeObject.getGeoCode(),2);
// get the distance from the requested postcode
local.distance = local.geo.getDistanceByGeocode(local.postcodeGeo.Lat,local.postcodeGeo.Lng,local.storeLat,local.storeLong);
if (local.distance LT arguments.radius){
// create a struct of the store object and its distance and add to the nearby stores array
local.thisStore =   {
store   =   storeObject
,distance   =   local.distance
};
ArrayAppend( local.nearbyStores,local.thisStore );
}
}
return local.nearbyStores;
}

2 für die Antwort № 2

Wenn Sie ein Objekt aus einem Array löschen, wird Ihre Schleife durcheinander gebracht.

Versuchen Sie es entweder rückwärts:

var i = arrayLen( local.stores );
for ( i; i == 0; i-- )

Oder in einer Schleife

for ( var local.store in local.stores )

(Das ist ein grober Code, der einige Änderungen benötigt)