/ / ORM Entity - Supprimer un enregistrement et ajouter une propriété - coldfusion, coldfusion-9

Entité ORM - Supprimer un enregistrement et ajouter une propriété - coldfusion, coldfusion-9

Je suis en train de créer un localisateur de magasin qui fonctionnesur un rayon d'un code postal. Je l'ai souvent fait en utilisant des requêtes et des QoQ standard, mais en essayant maintenant de les assembler à l'aide de cf9 ORM ... mais semblait avoir atteint la limite de mes capacités avec le dernier bit.

Je sors une entité et la traite. À la fin, je dois:

une. Supprimer un enregistrement s'il ne répond pas à certains critères (la distance est supérieure à celle spécifiée par l'utilisateur)

OU b. Ajoutez une nouvelle propriété à l'enregistrement pour enregistrer la distance.

Donc, à la fin, tout ce que je veux dans mon entité sont les magasins qui se trouvent dans la plage spécifiée par l'utilisateur, chaque enregistrement contenant la distance calculée.

La meilleure façon de voir ce que j'essaie de faire est de voir la fonction complète

Toutes les suggestions grandement appréciées!

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;
}

Réponses:

1 pour la réponse № 1

Je vais aborder cela sous un angle différent:

1) Au lieu de supprimer du tableau de tous les magasins ceux qui ne correspondent pas, je construis un tableau de ceux qui le font et le renvoie.

2) Si la distance est spécifique à chaque requête etpas une propriété de l’objet magasin, je n’essayerai donc pas de l’ajouter au magasin, mais je l’associerai simplement aux données spécifiques que je retourne pour cette recherche.

En mettant les 2 ensemble, je retournerai un tableau destructures contenant l’objet magasin et sa distance par rapport au code postal demandé. (Vous pouvez simplement renvoyer une structure unique de l'objet magasin et de la distance, avec l'ID de magasin comme clé, mais je préfère travailler avec des tableaux.)

Voici comment je l'ai codé (non testé car je n'ai pas votre code de classe ou d'entité géographique):

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 pour la réponse № 2

Si vous supprimez un objet d'un tableau, cela gâchera votre boucle.

Essayez soit de faire une boucle en arrière:

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

Ou en boucle comme ça

for ( var local.store in local.stores )

(C’est un code approximatif qui peut nécessiter quelques ajustements)