简体   繁体   中英

Cakephp update or add new record

I have an image upload that adds the filename to a table called attachments. If the id already exists then I want it to update and if not then create a new record. At the moment it creates a new record so I have multiple records forthe one id. The id's are from a table called Addon's.

I am not sure how to do this in cakephp.

    if (!empty($this->data)) {
        $this->layout = null;
        //if(empty($this->data['AddOn']['id'])){unset($this->data['AddOn']);}

        // restructure data for uploader plugin // NEED TO GET RID OF THIS ? MOVE IT
        $tmp_file = $this->data['Attachment'][0]['file'];
        $tmp_file['extension'] =  array_reverse(explode('.', $tmp_file['name']));
        $tmp_file['extension'] = $tmp_file['extension'][0];
        $tmp_file['title'] = strtolower(substr($tmp_file['name'],0,(0-strlen('.'.$tmp_file['extension']))));
        $this->data['Attachment'][0]['alternative'] = ucwords(str_replace('_',' ', $tmp_file['title']));

        $previous = $this->AddOn->Attachment->find('first', array('conditions'=> array('model'=>'AddOn', 'foreign_key'=>$id)));
        if( !empty( $previous ) ) {
            $this->AddOn->Attachment->id = $previous[ 'Attachment' ][ 'id' ];
        }

        if ($this->AddOn->save($this->data, array('validate' => 'first'))) {    

            $id = $this->AddOn->Attachment->getLastInsertID();

            $att = $this->AddOn->Attachment->query("SELECT * from attachments WHERE id = ".$id);
            $this->set('attachment',$att[0]['attachments']);

        } else {
            $tmp_file['name'] = 'INVALID FILE TYPE';
        }


        //debug($this->data);
        $this->set('file', $tmp_file);
        $this->RequestHandler->renderAs($this, 'ajax');
        $this->render('../elements/ajax');

    }

save() and saveAll() automatically update an existing row if the id has been set. You can do something like:

$previous = $this->AddOn->Attachment->find( /* whatever conditions you need */ );
if( !empty( $previous ) ) {
    $this->AddOn->Attachment->id = $previous[ 'Attachment' ][ 'id' ];
}

Now the old record will be updated if it exists.

As a side note, the code after a successful saveAll() doesn't make much sense: first you're saving data to the database, then immediately retrieving it again. You can just keep using $this->data that already has the same content.

And another side note: you should use query() only as a last resort when you can't use Cake's other methods. query("SELECT * from attachments WHERE id = ".$id) is a trivial case that can be rewritten as $this->Model->id = $id; $this->Model->read(); $this->Model->id = $id; $this->Model->read(); or using a simple $this->Model->find() query.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM