Search code examples
cakephppropertiesmodelon-the-fly

Programmatically setting a field inside a model in CakePHP


I'm trying to set a field on the fly inside a model, so it will get returned in my with any read action. I looked into virtual fields, but they're not quite right, since they basically execute SQL queries.

In this example, I'm trying to return a value, based on a simple check, to see whether or not a user has activated their account or not. Inside my model, I want to run this function:

public function status() {
    if ($this->field('password')) {
        return = 'active';
    } else if ($this->Ticket->field('id')) {
        return = 'pending';
    } else {
        return = 'inactive';
    }
}

The intent is to access that in my view via $user['User']['status'], so I could apply CSS styles, etc, based on the result.

But that in between of setting $this['User']['status'] = status() is eluding me right now.

Also, since I'm reading my list of Users different ways (sometimes with pagination, or one user at a time) this isn't something I want to set in my controller. I want the property to simply appear in the model when read.


Solution

  • How about doing your logic and appending it to the results in the afterFind callback? (which - per it's name is triggered after you do a find()) Something like this:

    //User model
    public function afterFind($results) {
    
        if ($this->field('password')) {
            $results[$this->alias]['status'] = 'active';
    
        } else if ($this->Ticket->field('id')) {
            $results[$this->alias]['status'] = 'pending';
    
        } else {
            $results[$this->alias]['status'] = 'inactive';
        }
    }