CakePHP:用户数据 saveAll 静默失败?

Posted

技术标签:

【中文标题】CakePHP:用户数据 saveAll 静默失败?【英文标题】:CakePHP: User data saveAll silently fails? 【发布时间】:2012-03-18 16:38:16 【问题描述】:

我有一个用户模型,它有许多乐器和流派。当我使用下面的代码时,仪器和流派会保存:

$this->User->saveAll($this->data, array(
                'fieldList' => array('User', 'UserInstrument', 'Genre')))
        )

但用户没有。在我的调试器中所有 invalidFields 数组都是空的 (User, UserInstrument, Genre, UserGenre, Instrument)。

不过,我注意到的一件奇怪的事情是这里:

public function beforeSave() 
        // get the password reset
        if(isset($this->data[$this->alias]['password_reset'])) 
            $this->data[$this->alias]['password'] = $this->data[$this->alias]['password_reset'];
            unset($this->data[$this->alias]['password_reset']);
        
        // get rid of the password confirm
        if(isset($this->data[$this->alias]['password_confirm'])) 
            unset($this->data[$this->alias]['password_confirm']);
        
        // hash the password
        if (isset($this->data[$this->alias]['password'])) 
            $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
        
        return true;
    

我正在取消设置password_resetpassword_confirm,但是在保存完成后,这些字段会神奇地出现在$this->data['User'] 中(可能是从$_POST 重新获取的)。但是如果保存时出错,那么saveAll 将返回 false。我的错误日志中也没有任何内容。

关于为什么这无声无息地失败的任何想法?谢谢!

【问题讨论】:

【参考方案1】:

如果您的目的是为新创建的用户使用哈希,请咨询this

尤其是简单的 beforeSave 函数

public function beforeSave() 
    if (isset($this->data[$this->alias]['password'])) 
        $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
    
    return true;

请理解,在 cakephp 中,如果您包含一个实际上不在模型数据表中的字段,该字段将被忽略。因此,您实际上不需要为您的 password_reset 和 password_confirm 字段进行取消设置。

关于保存关联记录和使用fieldList,我注意到您没有在数组的fieldList键中明确说明要保存的字段。

此外,您说 User hasMany Instrument 和 User hasMany Genre。

请使用 saveAssociated 方式。

在控制器中像这样准备数据:

$this->data['Instrument'] = array(
    array('instrument_field1'=>'v1',
           'instrument_field2' => 'v2',
         ),// first instrument
    array('instrument_field1' => 'v1',
          'instrument_field2' => 'v2')// second instrument
);

$this->data['Genre'] = array(
    array('field1'=>'v1',
           'field2' => 'v2',
         ),// first genre
    array('field1' => 'v1',
          'field2' => 'v2')// second genre
);

或者在你的表单中你做这样的事情:

$this->Form->input('Instrument.0.field1'); // for the first instrument 
$this->Form->input('Instrument.1.field1'); // for the second instrument

如果我误解了问题,请在我的回答中发表评论。

【讨论】:

您好,Kimsia,感谢您的回复。在我的beforeSave() 中,我支持密码散列以及密码重置,这在用户编辑他们的帐户时可用。至于乐器和流派,那些保存得当。我将尝试将特定字段添加到 fieldList 并查看它们是否正确保存,然后在这里发表评论。感谢您的帮助:) 嗨@Garrett,这就是我通常为用户创建和用户更新做的事情。为了创建新用户,我倾向于有一个名为 createNewUserDuringSignup 的单独方法在这个方法中,我确保我有 $this->create();以及新用户的其他相关内容。对于更新密码,我也有一个单独的方法。至于 beforeSave,我像你一样散列密码,除了我添加了一个 isset 以确保该字段存在。我还将散列一个名为 new_password 的字段,用于重置密码。如果您想使用实际代码进行更详细的解释,请告诉我。我会做一个页面 所以你需要更详细的解释吗? InstrumentGenre 可以保存,但User 不能。我尝试删除所有验证,但这也不起作用。将特定字段添加到 fieldList 数组也不起作用:( a) 你试过我的方法了吗?如果没有,b) 那么您是否记得在 User 中为您的 beforeSave 设置 return true?【参考方案2】:

我取出了fieldList。不是最安全的解决方案,但这只会带来更多的麻烦。

【讨论】:

以上是关于CakePHP:用户数据 saveAll 静默失败?的主要内容,如果未能解决你的问题,请参考以下文章

Cakephp HABTM saveAll 创建错误的数据库记录

Cakephp - saveAll 和 beforeSave

CakePHP 使用 saveAll:如何使用 HABTM 链接记录保存额外数据?

cakephp:使用 saveAll(),导入的(非表单相关的)关联数据不保存

CakePHP如何在一个saveAll中不知道外键的情况下创建hasMany数据?

CakePHP 奇怪的 saveAll 问题。返回 true,但在数据库中没有任何内容