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 [email protected]
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
-~----------~----~----~----~------~----~------~--~---