On Thursday, 27 June 2013 22:25:02 UTC+2, Vanja Dizdarević wrote:
>
> As "solved" in the thread I linked to in the original post: 


>          public function afterFind($results, $primary = false) { 
>                 if (method_exists($this, 'doAfterFind')) { 
>                           if ($primary) { 
>                                    foreach ($results as $key => $val) { 
>                                             if (isset($val[$this->alias])) 
> { 
>                                              
>         $results[$key][$this->alias] = 
> $this->doAfterFind($results[$key][$this->alias]); 
>                                                 } 
>                                       } 
>                           } else { 
>                                   if (isset($results[$this->primaryKey])) 
> { 
>                                            $results = 
> $this->doAfterFind($results); 
>                                    } else { 
>                                             foreach ($results as $key => 
> $val) { 
>                                                      if 
> (isset($val[$this->alias])) { 
>                                                               if 
> (isset($val[$this->alias][$this->primaryKey])) { 
>                                                                
>         $results[$key][$this->alias] = 
> $this->doAfterFind($results[$key][$this->alias]); 
>                                                               } else { 
>                                                                
>         foreach ($results[$key][$this->alias] as $key2=> $val2) { 
>                                                                         
>         $results[$key][$this->alias][$key2] = 
> $this->doAfterFind($results[$key][$this->alias][$key2]); 
>                                                                            
>    } 
>                                                                     } 
>                                                           } 
>                                                 } 
>                                       } 
>                            } 
>                 } 
>                  return $results; 
>          } 
> }
>

This code looks to be way over complex, possibly a testament to the 
none-value of reading 5 year old posts on a google group for a framework 
which is actively maintained and applying found advice blindly.


> This supposedly applies the same "doAfterFind" method to all records, 
> regardless of the passed $results array format, taking into account all 
> possible associations of a primary model to this model.
>
> The actual questions is: What are all array formats we can expect in the 
> $results array?
>

Does that mean you still haven't looked =)?

a count looks like this:

array(
        (int) 0 => array(
                (int) 0 => array(
                        'count' => '9'
                )
        )
)


a find first looks like this:


array(
        (int) 0 => array(
                'Alias' => array(
                        'id' => '1'
                ),
                'HasManyAssoc' => array(
                        (int) 0 => array(
                                'id' => '1'
                        )
                )
        )
)


a find all looks like this:

array(

        (int) 0 => array(
                'Alias' => array(
                        'id' => '1'
                ),
                'HasManyAssoc' => array(
                        (int) 0 => array(
                                'id' => '1'
                        )
                )
        ),

        ...
)


The "$primary = false" query (an intermediary hasMany query result) looks like 
this:


array(
        (int) 0 => array(
                'HasManyAssoc' => array(
                        (int) 0 => array(
                                'id' => '1'
                        )
                )
        ),

        ...
)


There's a very simple pattern there:


array($int => array('alias' => array('field' => $value)));


With a simple exception for hasMany associations, when included in the 
primary query's results, all primary finds *always *have the same results 
format.



> To quote the docs:
>  If a model is queried as an association the format of$results can 
> differ; instead of the result you would normally get from a find operation, 
> you may get this:
>
> $results = array(
>     'field_1' => 'value1',
>     'field_2' => 'value2');
>
>  

> So, if I wish the afterFind to find the data in the results array, I have 
> to test the format of the array or can I rely on $primary value?
>

I .. think you should stop wasting your time and *ask* how to do something 
specifically, from the look of your afterFind method, you're writing some 
sort of appmodel method that is converting/processing all data. Right now 
it's going to run on all queries, loop on all keys and therefore probably 
affect performance even if it's doing what you want it to do. You're 
probably better of writing either a recursive method to operate on the 
whole results format or a much narrower scope method that *just* does what 
you specifically want.

*What is your afterFind method trying to do?*
*
*
AD

-- 
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

--- 
You received this message because you are subscribed to the Google Groups 
"CakePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/cake-php.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to