Wednesday, April 16, 2014

Re: cake 3 - is it possible to use formatResults to stacking multiple operations like mapper/reducer?

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 <jose.zap@gmail.com>:
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 <jose.zap@gmail.com>:
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 <batopa@gmail.com>:
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 cake-php+unsubscribe@googlegroups.com.
To post to this group, send email to cake-php@googlegroups.com.
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 cake-php+unsubscribe@googlegroups.com.
To post to this group, send email to cake-php@googlegroups.com.
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 cake-php+unsubscribe@googlegroups.com.
To post to this group, send email to cake-php@googlegroups.com.
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 the Google Groups "CakePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to cake-php+unsubscribe@googlegroups.com.
To post to this group, send email to cake-php@googlegroups.com.
Visit this group at http://groups.google.com/group/cake-php.
For more options, visit https://groups.google.com/d/optout.

No comments: