在cakePHP中的afterSave()中保存模型

Jas*_*son 4 php frameworks cakephp

我有一个带有文件上传字段的表单,我已经创建了一个模型行为文件来处理文件处理.

我有两个函数,beforeSave和afterSave:

在beforeSave中我做了一些事情,然后将数据中的文件值设置为null,以便保存.否则它会尝试保存数组,而数据库只需要一个字符串(文件名)

在afterSave中,我根据表单上的一些文本字段生成一个新的文件名,并在其前面添加lastInsertId.我还将文件从temp移动到所需位置.这一切都很好,但是当我尝试将新文件名保存到模型时,它就不起作用了.

我做了很多测试和调试,也花了几个小时在线搜索.结论是你不能保存在afterSave中,它会自动触发并在之前再次运行.

所以我的问题是,如何更新新插入的模型?插入的文件名需要在其名称中包含主键,并在beforeSave时具有未知.

感谢任何帮助!贾森

Jus*_* T. 15

如果你想绕过 afterSave()本身的所有回调(afterSave/beforeSave),我发现这个语法对我有用:

$this->save($data, array('callbacks'=>false));
Run Code Online (Sandbox Code Playgroud)

要禁用触发器,手册会指出:

save方法还有一个替代语法:

save(array $ data = null,array $ params = array()) $ params array可以使用以下任何可用选项作为键:

array(
     'validate' => true,
     'fieldList' => array(),
     'callbacks' => true //other possible values are false, 'before', 'after' )
Run Code Online (Sandbox Code Playgroud)


Ish*_*Ish 6

它可以这样做

// Its your model Image.php
function afterSave($created) {
    if($created) {
         // its new record
         // do your work here
    }
}
Run Code Online (Sandbox Code Playgroud)

Little Tweak(不推荐)

如果你想在afterSave()使用中绕过beforeSave on db operations $this->Model->query(),而不是 $this->Model->save();

// little hack to bypass beforeSave
$this->Model->query('UPDATE listings SET name="xx" WHERE id="1"');
Run Code Online (Sandbox Code Playgroud)