One of the things to be careful of in CakePHP development is the minor differences between these 2 methods and what they actually do.
The key thing to remember here is that Model::read() will mutate the models state as well as returning the data. Model::find() will not.
I've fallen foul of this one a couple of times recently (yeah I know, more fool me), so I just wanted to get a quick post up here. Share the knowledge and, by writing it down, get it to stick in my own mind.
<?php // in model Widget for example $widget = $this->read(null, $id); // $widget will be assigned with the data from the row // with id $id // $this->data instance var will also be assigned with returned // data, overwriting anything that was in there before
<?php // in model Widget for example $widget = $this->findById($id); // the findByX methods use Model::find() // $widget will be assigned with the data from the row // with id $id // $this->data instance var will still hold the same value it had before the find() call
I was caught out with this recently when looking up a value in the database during a custom validation method. I accidentally used the
read() method, which overwrote the data from the form that was in
$this->data and replaced it with the data from the database, which in fact caused validation to pass when it shouldn't
There is a time and place for both methods, just don't get them mixed up otherwise they can cause some strange effects.
And if you're like me, it could take a couple of hours debugging to notice the mistake!