Cakephp之前在使用saveAll时不保留新数据?
我有一个相对简单的条目模型,只有五个字段:
> id 所以,没什么特别的.现在,单个表单可以有多个条目(已经存在的条目和刚创建的新条目),表单通过ajax调用进行扩展. 当我提交表单时,$this->数据如下所示: Array ( [Entry] => Array ( [date] => 2011-01-07 [0] => Array ( [id] => 1 [type] => Eat [amount] => 1 Steak,one baked potatoe [unit] => lunch [time] => Array ( [hour] => 13 [min] => 31 ) ) [1] => Array ( [type] => weight [amount] => 78.5 [unit] => KG [time] => Array ( [hour] => 22 [min] => 22 ) ) ) ) $this-> data [‘Entry’] [‘date’]中的第一个条目是所有条目都应使用的日期.而且由于缺少user_id,我在entry-model中创建了一个“beforeSave”函数.它看起来像这样: function beforeSave() { App::import('Component','Session'); $this->Session = new SessionComponent(); if (isset($this->data) && isset($this->data['Entry'])) { $date = $this->data['Entry']['date']; unset($this->data['Entry']['date']); foreach ($this->data['Entry'] as $n => $entry) { if (is_array($entry)) { $this->data['Entry'][$n]['date'] = $date . ' ' . $entry['time']['hour'] . ':' . $entry['time']['min'] . ':00'; $this->data['Entry'][$n]['user_id'] = $this->Session->read('Auth.User.id'); } } debug($this->data); } return true; } 我删除日期,将其与用户的时间条目一起添加,从而创建一个mysql datetime条目并添加登录用户的user_id.直截了当,真的.生成的数组(由最后一个debug()输出)如下所示: Array ( [Entry] => Array ( [0] => Array ( [id] => 1 [type] => Eat [amount] => 1 Steak,1 baked potatoe [unit] => lunch [time] => Array ( [hour] => 09 [min] => 31 ) [date] => 2011-01-07 09:31:00 [user_id] => 2 ) [1] => Array ( [type] => Weight [amount] => 78.5 [unit] => KG [time] => Array ( [hour] => 22 [min] => 22 ) [date] => 2011-01-07 22:22:00 [user_id] => 2 ) ) ) 所以它看起来就像我希望它看起来一样,它应该很容易保存.但是,当我使用$this-> Entry-> saveAll($this-> data [‘Entry’])来保存所有条目时,它不仅不起作用,而且当我调试$this->数据时直接在saveAll之后,它看起来与saveAll函数之前完全一样 – 日期又回到数组中,条目没有日期或user_id条目. 我可以看到beforeSave被调用,我可以看到它改变了$this->数据,但是在beforeSave结束和“saveAll”的使用之间的某处我的所有更改都丢失了,$this->数据被还原为这是原始状态.因此不会进行保存. 解决方法
尝试使用hasMany实现一些清理时遇到了类似的问题.事实证明问题在于saveAll()的工作原理.控制器中的$this->数据与Model :: beforeSave()回调中的$this->数据不同,两者不同步.当你调用Model :: saveAll()从控制器传递$this->数据时你明确地给模型“旧版本”的数据数组.当你在cake / libs / model / model.php中查看saveAll定义时,它只是:
if (empty($data)) { $data = $this->data } 并且不再需要在模型中同步修改后的$data数组,并通过参数$data从控制器传递.解决方案是不将数据传递给saveAll(),而是首先使用Model :: set()在模型上设置数据,然后调用Model :: saveAll()(不带$data参数). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |