2012-04-26 8 views
1

私のCakePHP(1.3)アプリケーションにプラグイン(https://github.com/webtechnick/CakePHP-FileUpload-Plugin)を使用しようとしています。CakePHP:FileUploadプラグインで新しいレコードを含むファイルを保存する

私には、PendingContractPendingContractFileという2つのモデルがあります。 PendingContractには、多くのPendingContractFileレコードを含めることができます。新しいPendingContractを保存するときに、アップロードしたPendingContractFileを保存したいと思います。しかし、PendingContractにIDがまだないので、私の保存メソッドが失敗し、それが私のPendingContractFileの外部キーとして使用されています。ここで明確にするために

は、私のモデルは以下のとおりです。

<?php 
class PendingContract extends AppModel { 

    var $name = 'PendingContract'; 
    var $belongsTo = array(
     'Supplier' 
    ); 
    var $hasMany = array(
     'PendingContractFile' 
    ); 
} 

class PendingContractFile extends AppModel { 

    var $name = 'PendingContractFile'; 
    var $belongsTo = array(
     'PendingContract' => array(
      'className' => 'PendingContract', 
      'foreignKey' => 'pending_contract_id' 
     ), 
     'Author' => array(
      'className' => 'User', 
      'foreignKey' => 'author_id' 
     ) 
    ); 
} 

そして、ここでは、私は私のPendingContractを保存しています私のコントローラのメソッドです:

<?php 
class PendingContractsController extends AppController { 

    function add() { 
     if (!empty($this->data)) { 
      if ($this->FileUpload->success) { 
       $this->Session->setFlash('Pending contract successfully created.'); 
       $this->redirect(array('action' => 'index')); 
      } 
      else { 
       $this->Session->setFlash($this->FileUpload->showErrors()); 
      } 
     } 
    } 
} 

現在、私は取得していますエラーは次のとおりです。

1452:子行を追加または更新できません:外部キー制約が失敗しました(pending_contract_files、CONSTRAINT pendin g_contract_files_ibfk_1 FOREIGN KEY UPDATE CASCADE ON DELETE CASCADE ON(pending_contract_id)REFERENCESのpending_contracts(ID))

それは私の新しい PendingContractレコードにアップロードされたファイルを添付するように、私は FileUploadプラグインを使用するにはどうすればよい

+0

AuthorまたはPendingContractレコードがあらかじめ保存されていないため、 'insert'が失敗しているようです。挿入するときには、これらの外部キーの両方が存在していなければなりません。私の推測では、どちらかまたは両方が欠けているということです。 – inkedmn

+0

@inkedmn私は問題を特定しました。私はちょうど誰かが同じ問題を抱えているのかどうか、もしそうなら、彼らがどんな解決策に到着したのか疑問に思いました。 –

+0

貼り付けたコードに基づいてデータを保存する方法がわからない –

答えて

0
public function beforeSave($options = array()) { 
    if (!isset($this->data[$this->alias][$this->primaryKey])) { 
     $this->data[$this->alias][$this->primaryKey] = String::uuid(); 
    } 
    return parent::beforeSave($options); 
} 

これにより、保存前にレコードの新しいUUIDが生成されます。おそらく、キーがまだ設定されていない場合にのみ行うべきです。

0

アップロードされたファイルとともに投稿されたデータを保存するとは思われませんでしたが、プラグインを調べました。これは、フォーム内の他の入力からアップロードファイルデータを意図的に分離し、各ファイルの保存を実行します。

個人的に私はコントローラレベルのコードに依存しないhttps://github.com/josegonzalez/uploadのような他のプラグインを試してみます。

0

私はあなたのケースで新しいPendingContractFileを追加するときに検証を解除しました。したがって、saveAllメソッドの前に、次のように追加してみてください:

unset($this->PendingContract->PendingContractFile->validate['pending_contract_id']); 

foreign_keyをチェックしないでください。 助けてくれることを願っています。

関連する問題