Saturday, June 29, 2013

Re: Get old record in beforeSave when updating (doing a $this->find() inside beforeSave callback)

Hi.

Why don't you save $this->data in another var before calling findById()?
Something like this:

class User extends AppModel {
   public function beforeSave($options){
       //is it an update?
       if (isset($this->data[$this->alias][$this->primaryKey])) {
            //read record
            $newdata = $this->data;
            $oldData = $this->findById($this->data[$this->alias][$this->primaryKey]); 
              //^^^ here's the problem! ^^^
            if ($oldData[$this->alias]['username_update_count'] >= 3){
               return false;
            }
            else {
              $this->data = $newdata;
              $this->data[$this->alias]['username_update_count'] = $oldData[$this->alias]['username_update_count'] + 1;
            }
       }
   }
}

Is there any issue doing this?

--
Renato Freire




On Sat, Jun 29, 2013 at 2:53 PM, Vanja Dizdarević <lex.non.scripta@gmail.com> wrote:
When updating a row, I wish to read the "old" data before saving the current record.

Here's a simplified example:

Controller code:
$this->User->save(['id' => 3, 'username' => 'a-new-username']);

Model code:
class User extends AppModel {
   public function beforeSave($options){
       //is it an update?
       if (isset($this->data[$this->alias][$this->primaryKey])) {
            //read record
            $oldData = $this->findById($this->data[$this->alias][$this->primaryKey]);
              //^^^ here's the problem! ^^^
            if ($oldData[$this->alias]['username_update_count'] >= 3){
               return false;
            }
            else {
              $this->data[$this->alias]['username_update_count'] = $oldData[$this->alias]['username_update_count'] + 1;
            }
       }
   }
}

The problem is, that $this->findById (or any other READ operation) fills the current $this->data with the read data, which ruins the current update. So my gut tells me to instantiate a new User model inside the beforeSave (not optimal) or to somehow use the DataSource directly without all the callbacks and Model instantiation.

The real scenario really has to be inside the beforeSave callback, because the logic is required for every modification.

Thanks!

--
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/groups/opt_out.
 
 

--
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/groups/opt_out.
 
 

No comments: