2011-09-21 21 views
2

添付ファイルという名前のテーブルにファイル名を追加する画像アップロードがあります。 IDが既に存在する場合は更新し、そうでない場合は新しいレコードを作成します。現時点では新しいレコードを作成するので、1つのIDに対して複数のレコードがあります。 IDはAddon'sというテーブルからのものです。Cakephpは新しいレコードを更新または追加します

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'); 

    } 

答えて

4

save()saveAll() idが設定されている場合、自動的に既存の行を更新します。

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

これで、古いレコードがあれば更新されるようになりました。

saveAll()が成功した後のコードはあまり意味がありません。まず、データをデータベースに保存してからすぐに再度取得します。あなたは既に同じ内容を持っている$this->dataをそのまま使うことができます。

もう1つの注意点:query()は、Cakeの他の方法を使用できないときの最後の手段としてのみ使用する必要があります。 query("SELECT * from attachments WHERE id = ".$id)は、$this->Model->id = $id; $this->Model->read();と書き直すことができ、または単純な$this->Model->find()クエリを使用することができます。

+0

私はcakephpを学んでいます。私はこれを私のために会社コードにしました。私はそれを正しく働かせるために苦労しています。アプリのほとんどは大丈夫ですが、たくさんのquery()があります。ここで助け –

+0

データが保存tehのafetr再び取り出される理由のおかげでは、Ajaxをアップロードした後、画面に表示されている\t \t \tます$ this->(「ファイル」、$のtmp_file)を設定します。 \t \t \t $ this-> RequestHandler-> renderAs($ this、 'ajax'); \t \t \t $ this-> render( '../ elements/ajax'); –

+0

確かに、あなたはまだあなたが持っているデータを照会しています。 '$ this-> set( 'attachment'、$ this-> data)'は同じように動作します。 – JJJ