加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Cakephp之前在使用saveAll时不保留新数据?

发布时间:2020-12-13 21:40:05 所属栏目:PHP教程 来源:网络整理
导读:我有一个相对简单的条目模型,只有五个字段: id type(此条目的数据类型) 数量(无论什么类型的数量) 单位(单位的单位) date(输入此条目的日期时间) user_id(输入的用户的ID 所以,没什么特别的.现在,单个表单可以有多个条目(已经存在的条目和刚创建的新条目),
我有一个相对简单的条目模型,只有五个字段:

> id
> type(此条目的数据类型)
>数量(无论什么类型的数量)
>单位(单位的单位)
> date(输入此条目的日期时间)
> user_id(输入的用户的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参数).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读