OK, I've got it. I will have a look to compile() method.
Thanks for your help
Il 16/apr/2014 21:06 "José Lorenzo" <[email protected]> ha scritto:

> Yeah, it will execute it as many times as you iterate the results. If you
> want to "cache" the results of a set of formatters call "compile()" on the
> resulting collection. This is because it needs to make sure formatters are
> applied to all rows.
>
>
> On Wednesday, April 16, 2014 5:06:38 PM UTC+2, bato wrote:
>>
>> uhm... I found when it repeats twice.
>>
>> try
>>
>> $table = TableRegistry::get('Articles');
>> $table
>>  ->find()
>> ->formatResults(function($r) {
>> return $r->map(function($r) {
>>  debug('a');
>> return $r;
>> });
>>  })
>> ->first();
>>
>> debug($table->toArray());
>>
>> I have debug($table->toArray()); after the find chain. I suppose that
>> first() already execute the query. Is it right?
>> But when I do toArray() it shouldn't redo the formatResults operation,
>> right?
>>
>>
>> 2014-04-16 14:45 GMT+02:00 José Lorenzo <[email protected]>:
>>
>>> I just tested with this code and checked that the callback is executed
>>> only once:
>>>
>>>  $table = TableRegistry::get('Articles');
>>> $table
>>> ->find()
>>>  ->formatResults(function($r) {
>>> return $r->map(function($r) {
>>> debug('a');
>>>  return $r;
>>> });
>>> })
>>> ->first();
>>>
>>> On Wednesday, April 16, 2014 2:33:35 PM UTC+2, José Lorenzo wrote:
>>>>
>>>> Paste the full code where you see it being called twice, please. I will
>>>> also check with my own code
>>>>
>>>> On Wednesday, April 16, 2014 2:23:54 PM UTC+2, bato wrote:
>>>>>
>>>>> ok it works!
>>>>>
>>>>> To me remain a mistery why using first() the callback in
>>>>> $results->map() is called twice while not using first is called once.
>>>>>
>>>>> Could it be a bug?
>>>>>
>>>>>
>>>>> 2014-04-16 13:11 GMT+02:00 José Lorenzo <[email protected]>:
>>>>>
>>>>>> Try this
>>>>>>
>>>>>> public findFlat($query, $options = []) {
>>>>>> return $query->formatResults(function($results, $query) {
>>>>>>  return $results->map(function($row) {
>>>>>> if ($row->content) {
>>>>>> $row->set($row->content->toArray(), ['guard' => false]);
>>>>>>  $row->unsetProperty('content');
>>>>>> }
>>>>>> return $row;
>>>>>>  });
>>>>>> });
>>>>>> }
>>>>>>
>>>>>> $row = $table->find('flat')->first();
>>>>>>
>>>>>>
>>>>>> On Tuesday, April 15, 2014 10:04:25 AM UTC+2, bato wrote:
>>>>>>>
>>>>>>> uhm...
>>>>>>>
>>>>>>> maybe I'm wrong to use map() function...
>>>>>>>
>>>>>>> return $results->map(function($row) {
>>>>>>>                 foreach ($row['content']->toArray() as $key =>
>>>>>>> $value) {
>>>>>>>                     $row[$key] = $value;
>>>>>>>                 }
>>>>>>>                 unset($row['content']);
>>>>>>>                 return $row;
>>>>>>>             });
>>>>>>>
>>>>>>>
>>>>>>> In my db I have only one row.
>>>>>>> When I find all results the callback inside map() is called one
>>>>>>> time.
>>>>>>> If I add first() to chain then it's called two times and the second
>>>>>>> time $row['content'] is undefined because I unset it before so thrown 
>>>>>>> fatal
>>>>>>> error. Why is it called two times?
>>>>>>>
>>>>>>> Suggestions?
>>>>>>>
>>>>>>>
>>>>>>> 2014-04-15 9:22 GMT+02:00 bato <[email protected]>:
>>>>>>>
>>>>>>>> Sure,
>>>>>>>>
>>>>>>>> I'm trying to add 'content' properties to main Entity properties
>>>>>>>> (it's an exercise to collpase entities properties in an array)
>>>>>>>>
>>>>>>>> [
>>>>>>>> (int) 0 => object(App\Model\Entity\Object) {
>>>>>>>>
>>>>>>>> 'new' => false,
>>>>>>>> 'accessible' => [
>>>>>>>>  '*' => true
>>>>>>>> ],
>>>>>>>>  'properties' => [
>>>>>>>> 'id' => (int) 5,
>>>>>>>>  'object_type_id' => (int) 12,
>>>>>>>> 'status' => 'on',
>>>>>>>>  'created' => object(DateTime) {
>>>>>>>> date => '2014-03-07 09:21:29'
>>>>>>>>  timezone_type => (int) 3
>>>>>>>> timezone => 'Europe/Rome'
>>>>>>>>  },
>>>>>>>> 'modified' => object(DateTime) {
>>>>>>>>  date => '2014-04-07 23:32:48'
>>>>>>>> timezone_type => (int) 3
>>>>>>>>  timezone => 'Europe/Rome'
>>>>>>>> },
>>>>>>>>  'start_date' => null,
>>>>>>>> 'end_date' => null,
>>>>>>>>  'subject' => null,
>>>>>>>> 'abstract' => null,
>>>>>>>>  'body' => null,
>>>>>>>> 'duration' => null
>>>>>>>>  ],
>>>>>>>> 'dirty' => [
>>>>>>>>  'id' => true,
>>>>>>>> 'start_date' => true,
>>>>>>>>  'end_date' => true,
>>>>>>>> 'subject' => true,
>>>>>>>>  'abstract' => true,
>>>>>>>> 'body' => true,
>>>>>>>>  'duration' => true
>>>>>>>> ],
>>>>>>>>  'virtual' => [],
>>>>>>>> 'errors' => [],
>>>>>>>>  'repository' => 'ImageObjects'
>>>>>>>>  }
>>>>>>>> ]
>>>>>>>>
>>>>>>>> This is the results of find all. In 'dirty' key you can see the
>>>>>>>> 'content' properties that I add to App\Model\Entity\Object properties.
>>>>>>>> I unset the 'content' key so it isn't show in the above array.
>>>>>>>>
>>>>>>>> I'm playing with ORM feature and I would want to know if
>>>>>>>> formatResults is usable in query chain.
>>>>>>>>
>>>>>>>>
>>>>>>>> Il giorno lunedì 14 aprile 2014 11:40:53 UTC+2, José Lorenzo ha
>>>>>>>> scritto:
>>>>>>>>>
>>>>>>>>> Can you explain what you are trying to do? I'm not sure I get it
>>>>>>>>> from your code example.
>>>>>>>>>
>>>>>>>>> On Monday, April 14, 2014 11:31:42 AM UTC+2, bato wrote:
>>>>>>>>>>
>>>>>>>>>> Hi,
>>>>>>>>>>
>>>>>>>>>> I'm trying to figure out if it's possible to use formatResults in
>>>>>>>>>> custom finder methods to use ORM chain. I have seen in docs the 
>>>>>>>>>> example
>>>>>>>>>> with mapper reducer.
>>>>>>>>>>
>>>>>>>>>> In my table object i have
>>>>>>>>>>
>>>>>>>>>> public findFlat($query, $options = []) {
>>>>>>>>>>        return $query->formatResults(function($results, $query) {
>>>>>>>>>>             return $results->map(function($row) {
>>>>>>>>>>                 foreach ($row['content']->toArray() as $key =>
>>>>>>>>>> $value) {
>>>>>>>>>>                     $row[$key] = $value;
>>>>>>>>>>                 }
>>>>>>>>>>                 unset($row['content']);
>>>>>>>>>>                 return $row;
>>>>>>>>>>             });
>>>>>>>>>>         });
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> then in my controller I have
>>>>>>>>>>
>>>>>>>>>> $images = TableRegistry::get('ImageObjects');
>>>>>>>>>> $result = $images->find('flat');
>>>>>>>>>> $result->contain(['Contents', 'Streams']);
>>>>>>>>>> debug($result->toArray());
>>>>>>>>>>
>>>>>>>>>> In this way it works but if I add first()
>>>>>>>>>>
>>>>>>>>>> $result->first();
>>>>>>>>>>
>>>>>>>>>> then I obtain a fatal error in findFlat() method
>>>>>>>>>>
>>>>>>>>>> Error: Call to a member function toArray() on a non-object
>>>>>>>>>>
>>>>>>>>>> Any help?
>>>>>>>>>> Am I using wrong formatResults()? Is it possible to chain only
>>>>>>>>>> mapper reducer?
>>>>>>>>>>
>>>>>>>>>> thanks
>>>>>>>>>> alberto
>>>>>>>>>>
>>>>>>>>>>  --
>>>>>>>> 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 a topic in
>>>>>>>> the Google Groups "CakePHP" group.
>>>>>>>> To unsubscribe from this topic, visit https://groups.google.com/d/
>>>>>>>> topic/cake-php/djk1Ip6_Ca4/unsubscribe.
>>>>>>>> To unsubscribe from this group and all its topics, 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/d/optout.
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> ------ bato -------
>>>>>>>
>>>>>>  --
>>>>>> 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 a topic in
>>>>>> the Google Groups "CakePHP" group.
>>>>>> To unsubscribe from this topic, visit https://groups.google.com/d/to
>>>>>> pic/cake-php/djk1Ip6_Ca4/unsubscribe.
>>>>>> To unsubscribe from this group and all its topics, 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/d/optout.
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> ------ bato -------
>>>>>
>>>>  --
>>> 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 a topic in the
>>> Google Groups "CakePHP" group.
>>> To unsubscribe from this topic, visit https://groups.google.com/d/
>>> topic/cake-php/djk1Ip6_Ca4/unsubscribe.
>>> To unsubscribe from this group and all its topics, 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/d/optout.
>>>
>>
>>
>>
>> --
>> ------ bato -------
>>
>  --
> 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 a topic in the
> Google Groups "CakePHP" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/cake-php/djk1Ip6_Ca4/unsubscribe.
> To unsubscribe from this group and all its topics, 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/d/optout.
>

-- 
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/d/optout.

Reply via email to