无法使用 cakephp 在 1 个模型上保存所有内容

cant saveall on 1 model with cakephp

我无法将所有记录保存到模型 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'
        ),
        ....
    )
);

很抱歉这么说,但您对 saveall 的使用很尴尬。使用 save 你通常想要创建新记录并且不指定 id 字段。 因此,您可能会遇到问题,因为 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,但您会保存映射。

编辑: 所以现在我遇到了你的问题 :) cake 无法知道 phone 是否已经设置,因此对当前条目的验证将 return一个错误。

那么您可以采取以下措施来解决这个问题:

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

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

或者最后也是最糟糕的解决方案:创建一个 $model->find('all') 并把它与你视图中的输入合并。

编辑: 最有可能的最好的事情是,如果你只是在你的模型 http://book.cakephp.org/2.0/en/models/data-validation.html#required

中用 notEmpty 替换 required

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

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

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() 更合适。 saveAll() 应该避免,因为它暗示您不确定您实际要保存什么;它主要用于 backwards compatiblity:-

This function receives the same options as the former two, and is generally a backwards compatible function. It is recommended using either saveMany or saveAssociated depending on the case.