2012-03-16 2 views
1

Я собираю поиск магазина, который работает на радиусе от почтового индекса. Я делал это много раз, используя стандартные запросы и QoQs, но теперь пытаюсь объединить их с помощью cf9 ORM ... но, похоже, дошел до предела моих возможностей с помощью последнего бита.ORM Entity - удалите запись и добавьте объект

Я вытаскиваю сущность и обрабатываю ее. В конце мне необходимо:

a. Удалите запись, если она не соответствует определенным критериям (расстояние больше указанного пользователем)

OR b. Добавьте новое свойство в запись, чтобы сохранить расстояние.

В конце концов, все, что я хочу в своей сущности, это те магазины, которые находятся в пределах диапазона, указанного пользователем, с каждой записью, содержащей рассчитанное расстояние.

Лучший способ увидеть то, что я пытался сделать это, чтобы просмотреть полную функцию

Любые предложения высоко оценили !!

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

ответ

1

Я бы подойти к этому с другой точки зрения :

1) Вместо того, чтобы удалять из массива всех магазинов те, которые не являются m atch, я бы построил массив тех, которые делают и возвращают это.

2) Если расстояние зависит от каждого запроса, а не от свойства объекта хранилища, то я бы не стал добавлять его в хранилище, а просто «связал» его с конкретными данными, которые я возвращаю для этот поиск.

Вводя в 2 вместе, я бы возвратил массив структур, содержащих объект магазина, и его расстояние от запрашиваемого почтового индекса. (Вы могли бы просто вернуть одну структуру объекта хранилища и расстояние, с идентификатором магазина как ключом, но я предпочитаю работать с массивами.)

Вот как я его закодировал (не проверял, потому что у меня нет ваш класс гео или код субъекта):

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

CF Simplicty .., которая работала и кажется, что подход я хочу взять, но я не могу найти способ, чтобы заказать результат на «расстояние». Я могу с объектом, возвращаемым EntityLoad(), но не может показаться, что выработаете, как бы я заказывал результаты, когда получаю массив из-за этого процесса. Я играл с ArraySort(), но это не делает трюк. Любые указатели? Еще раз спасибо CfSimplicity! – Jason

+0

Я закончил сортировку с этим cflib udf (http://cflib.org/udf/ArrayOfStructsSort) .. все работает. Большое спасибо за вашу помощь!! – Jason

+0

Рад, что это сработало, Джейсон. Возможно, простой структурный или двухмерный массив мог бы быть проще в конце концов. Кстати, я исправил пару незащищенных vars в моем коде: geo следует ссылаться как local.geo. – CfSimplicity

2

Если вы удалите объект из массива, он испортит ваш цикл.

Попробуйте либо перекручивание назад:

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

или перекручивание как этот

for (var local.store in local.stores) 

(Это грубый код и, возможно, потребуется несколько щипков)

Смежные вопросы