On Jan 17, 2008 9:52 PM, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: > > cake 1.2.0.6311-beta, PHP 5.2.4 > > I'm trying to use afterFind() in order to massage some data for a > model and am seeing PHP max out the memory limit (32MB). I'm only > using a subset of just 1000 records (about 5%) from the prod. DB > membership table. I'm using a technique that I saw given to create a > "full_name" field in the returned array by concating the first & last > names. In my case, I'm running urlencode() on the members' names to > create a new field, among other things. > > Part of the problem is that the fields i'm looking for might lie at > any of a number of levels, depending on whether i'm viewing a single > record or selecting many. So I have to do stuff lik this: > > function afterFind($results) > { > if (isset($results['id'])) > { > ... > return $results; > } > > foreach ($results as $key => $val) > { > if(array_key_exists($this->name, $val) && > isset($results[$key][$this- > >name]['id'])) > { > ... > } > else if (isset($results[$key]['id'])) > { > ... > } > } > return $results; > } > > Selecting 1000 records ate through memory pretty quick, so I limited > the fields to just id, first_name, last_name, organisation, and email > to start with. > > However, even with just those fields selected, I was still running out > of memory. It turned out that it was the methods I was passing my > array values to in order to create new fields. eg: > > $results['link_name'] = $this->linkName($result['first_name'], > $results['last_name']); > > where linkName() is just: > > return urlencode("${first_name}_${last_name}"); > > By taking out the method calls and repeating the same logic at each > level I was finally able to run this. However, now I'm finding that > afterFind() is called for every little query, including just looking > up an ID. So now I'm faced with placing even more logic in afterFind() > -- not a great prospect. > > So, as the subject suggests, I was poking around the Set class trying > to figure out if there was some way to use that for this problem. But > I can't think of anything that wouldn't likely cause even more memory > issues. > > Basically, I'm not even sure if I'm going about this the right way. Is > this an appropriate way to use afterind()? Is there a simpler way to > get at my Member data, no matter if it's just a single record or many? > > b > >
Bah! I was passing by value. OK, so I've changed it to: function afterFind(&$results) { if (isset($results['first_name'])) { $results['link_name'] = Member::makeLinkName($results['first_name'], $results['last_name']); ... return $results; } foreach ($results as $key => $val) { ... } return $results; } This allows me to avoid repeating a chunk of code, at least. But I'm still not confident that this is the best way to go about using afterFind(). I just came across this Autofield behavior: http://cakeexplorer.wordpress.com/category/model/ I'm going to play around with that a bit. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Cake PHP" group. To post to this group, send email to cake-php@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/cake-php?hl=en -~----------~----~----~----~------~----~------~--~---