1

我正在尝试FileUpload在我的 CakePHP (1.3) 应用程序中使用插件 (https://github.com/webtechnick/CakePHP-FileUpload-Plugin)。

我有两个模型:PendingContractPendingContractFile. APendingContract可以有许多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 pending_contract_files_ibfk_1 FOREIGN KEY (pending_contract_id) REFERENCES pending_contracts (id) ON DELETE CASCADE ON UPDATE CASCADE)

如何使用该FileUpload插件,以便将上传的文件与我的新PendingContract记录一起附加?

4

3 回答 3

0

我看了一下插件,它似乎不会将发布的数据与上传的文件一起保存。它有目的地将上传文件数据与表单中的任何其他输入分开,并为每个文件执行保存。

就个人而言,我会尝试其他不依赖任何控制器级代码的插件,例如https://github.com/josegonzalez/upload 。

于 2012-04-27T00:52:07.727 回答
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。如果密钥尚未设置,您可能只应该这样做。

于 2012-04-27T00:47:40.717 回答
0

我遇到了类似的问题,我所做的是在您的情况下添加新的 PendingContractFile 时取消验证。所以在 saveAll 方法之前尝试添加:

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

所以它不会检查foreign_key。希望能帮助到你。

于 2013-03-08T15:39:07.027 回答