不能在带有cakephp的1个型号上保存

时间:2015-06-02 12:23:12

标签: cakephp cakephp-model

我无法将所有记录保存到1模型中。我有一个数字数组,我添加了一个模型名称。

为了保存单个模型的多个记录,$data需要是一个数字索引的记录数组:'我做了这个,并尝试了很多品种与Tutor作为关键。我没有得到任何保存,因为我收到下面的错误消息。我不知道自己做错了什么,但是这种共同的功能却无法解决。我查看了其他帖子,但我无法看到我的错误。

http://book.cakephp.org/2.0/en/models/saving-your-data.html

if ($this->request->is('post') || $this->request->is('put')) {
    $tutordata=$this->request->data['Tutor'];
    //debug( $tutordata);
    $data=array();
    $this->Tutor->create();

    foreach ($tutordata as  $key => $item): 
        $data['Tutor'][$key]['id']=$item['id'];
        $data['Tutor'][$key]['payrate_10']=$item['payrate_10'];
        $data['Tutor'][$key]['payrate_vce']=$item['payrate_vce'];
        $data['Tutor'][$key]['payrate_assessment']=$item['payrate_assessment'];
    endforeach;

    debug( $data);
    //  $data=$this->request->data['Tutor'];
    //   if ($this->Tutor->saveAll($data)){ 
    if ($this->Tutor->saveAll($data['Tutor'])){
        //  return $this->redirect(array('action' => 'edit_paycycle'));
        $this->Session->setFlash(__('Your Pay Rates have been saved .'));
    }
    else{
        $this->Session->setFlash(__('2ERROR! Your Pay Rates have not been saved .'));
    }
}

这是数据array

array(
    'Tutor' => array(
        (int) 0 => array(
            'id' => '13',
            'payrate_10' => '25.00',
            'payrate_vce' => '25.00',
            'payrate_assessment' => '50.00'
        ),
        (int) 1 => array(
            'id' => '7',
            'payrate_10' => '30.00',
            'payrate_vce' => '45.00',
            'payrate_assessment' => '0.00'
        ),
        ....
    )
);

2 个答案:

答案 0 :(得分:1)

要说这个,但你对saveall的使用很尴尬。使用save时,您通常希望创建新记录,而不指定id字段。 所以也许你会得到ploblems因为cakephp需要更新,其中一个id已经存在于数据库中。

顺便说一下。你可以通过以下方式简化你的foreach:

foreach ($tutordata as  $item){
    $data['Tutor'][] = [
        'id'=>$item['id'],
        'payrate_10'=>$item['payrate_10'],
        'payrate_vce'=>$item['payrate_vce'],
        'payrate_assessment'=>$item['payrate_assessment']
    ];
};

您可以使用saveMany而不是使用saveAll,因为您只保存一个模型的数据。如果你将一个数字数组传递给saveAll(就像你这样),它会自动映射到saveMany,但你会保存映射。

编辑所以现在我遇到了你的问题:)蛋糕无法知道手机是否已经设置,所以对当前条目的验证将返回错误。

所以你可以做的就是解决这个问题:

关闭常规验证: http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-savemany-array-data-null-array-options-array并对您想要的字段进行特定验证。

或者在视图中创建保留实际值的隐藏字段。

或者最后和最差的解决方案:使用条件中的id进行$ model-> find('all')并将其与视图中的输入合并。

修改: 如果您只是在模型http://book.cakephp.org/2.0/en/models/data-validation.html#required中替换notEmpty所需的,那么最有可能是最好的事情

答案 1 :(得分:0)

如果您尝试更新现有行,那么您不应该使用$this->Tutor->create();,因为这会指示Cake创建新记录。这可能是导致问题的原因。

除了可能使用fieldList选项将要保存的字段列入白名单之外,您的foreach循环似乎没什么意义: -

if ($this->request->is('post') || $this->request->is('put')) {
    $result = $this->Tutor->saveMany(
        $this->request->data['Tutor'],
        'fieldList' => array(
            'Tutor' => array(
                'id',
                'payrate_10',
                'payrate_vce',
                'payrate_assessment'
            )
        )
    );

    if ($result !== false) {
        $this->Session->setFlash(__('Your Pay Rates have been saved .'));
    } else {
        $this->Session->setFlash(__('2ERROR! Your Pay Rates have not been saved .'));
    }
}

正如其他人所说,由于您需要保存同一模型的多行,因此saveAll()更为合适。应该避免使用saveMany(),因为这意味着您不确定您实际想要保存的内容;它主要用于backwards compatiblity: -

  

此函数接收与前两个相同的选项,并且是   通常是向后兼容的功能。建议使用   根据具体情况,saveMany或saveAssociated。